Quelles sont les méthodes de liaison et de dissociation des classes et des objets en Python

王林
Libérer: 2023-05-19 18:39:38
avant
1416 Les gens l'ont consulté

Les méthodes définies dans la classe peuvent être grossièrement divisées en deux catégories : les méthodes liées et les méthodes non liées. Les méthodes de liaison peuvent être divisées en méthodes liées aux objets et méthodes liées aux classes.

1. Méthode de liaison

1 La méthode de liaison d'un objet

La méthode qui n'est modifiée par aucun décorateur de la classe est la méthode liée à l'objet. Ce type de méthode est spécialement personnalisé pour l'objet.

class Person:
    country = "China"

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def speak(self):
        print(self.name + ', ' + str(self.age))


p = Person('Kitty', 18)
print(p.__dict__)
Copier après la connexion
{'name': 'Kitty', 'age': 18}

print(Person.__dict__['speak'])
<function Person.speak at 0x10f0dd268>
Copier après la connexion

speak est la méthode liée à l'objet. Cette méthode n'est pas dans l'espace de noms de l'objet, mais dans l'espace de noms de la classe.

Lorsque vous appelez une méthode liée à un objet via un objet, il y aura un processus de transfert de valeur automatique, c'est-à-dire que l'objet actuel est automatiquement passé au premier paramètre de la méthode (self, généralement appelé self, mais il peut également être écrit sous un autre nom); Si vous utilisez un appel de classe, le premier paramètre doit être passé manuellement.

p = Person(&#39;Kitty&#39;, 18)
p.speak()  # 通过对象调用
#输出
Kitty, 18

Person.speak(p)  # 通过类调用
#输出
Kitty, 18
Copier après la connexion

2 Méthodes de liaison de classe

Les méthodes modifiées par @classmethod sont des méthodes de classe, c'est-à-dire des méthodes liées à des classes plutôt qu'à des instances. Ce type de méthode est personnalisé spécifiquement pour la classe. Lorsque vous appelez une méthode liée à une classe, la classe elle-même est passée comme premier argument de la méthode.

class Operate_database():
    host = &#39;192.168.0.5&#39;
    port = &#39;3306&#39;
    user = &#39;abc&#39;
    password = &#39;123456&#39;

    @classmethod
    def connect(cls):  # 约定俗成第一个参数名为cls,也可以定义为其他参数名
        print(cls)
        print(cls.host + &#39;:&#39; + cls.port + &#39; &#39; + cls.user + &#39;/&#39; + cls.password)


Operate_database.connect()
Copier après la connexion

Output


192.168.0.5:3306 abc/123456

Il peut également être appelé via un objet, mais le premier paramètre passé par défaut est toujours la classe correspondante à cet objet.

Operate_database().connect()  # 输出结果一致

#输出
<class &#39;__main__.Operate_database&#39;>
192.168.0.5:3306 abc/123456
Copier après la connexion

2. Méthodes non liées

Les méthodes modifiées avec @staticmethod à l'intérieur d'une classe sont des méthodes non liées. Ce type de méthode n'est pas différent d'une fonction définie ordinaire. Elle n'est pas liée à une classe ou à un objet et peut être appelée par n'importe qui. , et il n'y a pas d'effet de transfert automatique de valeur.

import hashlib


class Operate_database():
    def __init__(self, host, port, user, password):
        self.host = host
        self.port = port
        self.user = user
        self.password = password

    @staticmethod
    def get_passwrod(salt, password):
        m = hashlib.md5(salt.encode(&#39;utf-8&#39;))  # 加盐处理
        m.update(password.encode(&#39;utf-8&#39;))
        return m.hexdigest()


hash_password = Operate_database.get_passwrod(&#39;lala&#39;, &#39;123456&#39;)  # 通过类来调用
print(hash_password)

#输出
f7a1cc409ed6f51058c2b4a94a7e1956
Copier après la connexion
p = Operate_database(&#39;192.168.0.5&#39;, &#39;3306&#39;, &#39;abc&#39;, &#39;123456&#39;)
hash_password = p.get_passwrod(p.user, p.password)  # 也可以通过对象调用
print(hash_password)
#输出
0659c7992e268962384eb17fafe88364
Copier après la connexion

En bref, les méthodes non liées sont des méthodes ordinaires placées à l'intérieur de la classe.

3. Exercice

Supposons maintenant que l'objet instancié par Mysql puisse lire les données du fichier settings.py.

# settings.py
IP = &#39;1.1.1.10&#39;
PORT = 3306
NET = 27
Copier après la connexion
# test.py
import uuid


class Mysql:
    def __init__(self, ip, port, net):
        self.uid = self.create_uid()
        self.ip = ip
        self.port = port
        self.net = net

    def tell_info(self):
        """查看ip地址和端口号"""
        print(&#39;%s:%s&#39; % (self.ip, self.port))

    @classmethod
    def from_conf(cls):
        return cls(IP, NET, PORT)

    @staticmethod
    def func(x, y):
        print(&#39;不与任何人绑定&#39;)

    @staticmethod
    def create_uid():
        """随机生成一个字符串"""
        return uuid.uuid1()

#学习中遇到问题没人解答?小编创建了一个Python学习交流:711312441
# 默认的实例化方式:类名()
obj = Mysql(&#39;10.10.0.9&#39;, 3307, 27)
Copier après la connexion
obj.tell_info()

10.10.0.9:3307
Copier après la connexion

1 Résumé des méthodes de liaison

Si le code du corps de la fonction doit utiliser une classe passée en externe, la fonction doit être définie comme une méthode liée à la classe

Si le code du corps de la fonction doit utiliser un objet passé en externe, alors La fonction doit être définie comme une méthode liée à l'objet

# 一种新的实例化方式:从配置文件中读取配置完成实例化
obj1 = Mysql.from_conf()
obj1.tell_info()

#输出
1.1.1.10:27



print(obj.tell_info)
#输出
<bound method Mysql.tell_info of <__main__.Mysql object at 0x10f469240>>



print(obj.from_conf)
#输出
<bound method Mysql.from_conf of <class &#39;__main__.Mysql&#39;>>
Copier après la connexion

2 Résumé des méthodes non liées

Si le code du corps de la fonction ne nécessite ni une classe passée en externe ni un objet passé en externe, la fonction doit être définie dans un non -méthode liée/fonction ordinaire

obj.func(1, 2)
#输出
不与任何人绑定


Mysql.func(3, 4)
#输出
不与任何人绑定


print(obj.func)
#输出
<function Mysql.func at 0x10f10e620>


print(Mysql.func)
#输出
<function Mysql.func at 0x10f10e620>


print(obj.uid)
#输出
a78489ec-92a3-11e9-b4d7-acde48001122
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal