Maison >développement back-end >Tutoriel Python >Quelles sont les méthodes de liaison et de dissociation des classes et des objets en Python
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.
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('Kitty', 18) p.speak() # 通过对象调用 #输出 Kitty, 18 Person.speak(p) # 通过类调用 #输出 Kitty, 18
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 = '192.168.0.5' port = '3306' user = 'abc' password = '123456' @classmethod def connect(cls): # 约定俗成第一个参数名为cls,也可以定义为其他参数名 print(cls) print(cls.host + ':' + cls.port + ' ' + cls.user + '/' + 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 '__main__.Operate_database'> 192.168.0.5:3306 abc/123456
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('utf-8')) # 加盐处理 m.update(password.encode('utf-8')) return m.hexdigest() hash_password = Operate_database.get_passwrod('lala', '123456') # 通过类来调用 print(hash_password) #输出 f7a1cc409ed6f51058c2b4a94a7e1956
p = Operate_database('192.168.0.5', '3306', 'abc', '123456') 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.
Supposons maintenant que l'objet instancié par Mysql puisse lire les données du fichier settings.py.
# settings.py IP = '1.1.1.10' 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('%s:%s' % (self.ip, self.port)) @classmethod def from_conf(cls): return cls(IP, NET, PORT) @staticmethod def func(x, y): print('不与任何人绑定') @staticmethod def create_uid(): """随机生成一个字符串""" return uuid.uuid1() #学习中遇到问题没人解答?小编创建了一个Python学习交流:711312441 # 默认的实例化方式:类名() obj = Mysql('10.10.0.9', 3307, 27)
obj.tell_info() 10.10.0.9:3307
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 '__main__.Mysql'>>
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!