Maison >développement back-end >Tutoriel Python >Quelles sont les méthodes de liaison et de dissociation des classes et des objets en Python

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

王林
王林avant
2023-05-19 18:39:381454parcourir

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__)
{'name': 'Kitty', 'age': 18}

print(Person.__dict__['speak'])
<function Person.speak at 0x10f0dd268>

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

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()

Output

4133de66e39980eb57623002c4a0aef5
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

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
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

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
# 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)
obj.tell_info()

10.10.0.9:3307

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;>>

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer