Heim > Artikel > Backend-Entwicklung > Was sind die Bindungs- und Entbindungsmethoden von Klassen und Objekten in Python?
Die in der Klasse definierten Methoden können grob in zwei Kategorien unterteilt werden: gebundene Methoden und nicht gebundene Methoden. Bindungsmethoden können in an Objekte gebundene Methoden und an an Klassen gebundene Methoden unterteilt werden.
Die Methode in der Klasse, die von keinem Dekorateur geändert wird, ist an Objektmethoden gebunden. Diese Methoden werden speziell für das Objekt angepasst.
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 ist eine an ein Objekt gebundene Methode. Diese Methode befindet sich nicht im Namensraum des Objekts, sondern im Namensraum der Klasse.
Wenn Sie eine an ein Objekt gebundene Methode über ein Objekt aufrufen, findet ein automatischer Wertübertragungsprozess statt, dh das aktuelle Objekt wird automatisch an den ersten Parameter der Methode übergeben (selbst, normalerweise aufgerufen). self oder als anderer Name geschrieben); wenn es über eine Klasse aufgerufen wird, muss der erste Parameter manuell übergeben werden.
p = Person('Kitty', 18) p.speak() # 通过对象调用 #输出 Kitty, 18 Person.speak(p) # 通过类调用 #输出 Kitty, 18
Die durch @classmethod geänderte Methode gehört zur Klassenmethode, das heißt, die Methode ist an die Klasse und nicht an die Instanz gebunden. Diese Art von Methode wird speziell für die Klasse angepasst. Wenn Sie eine an eine Klasse gebundene Methode aufrufen, wird die Klasse selbst als erstes Argument an die Methode übergeben.
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
Es kann auch über ein Objekt aufgerufen werden, aber der erste standardmäßig übergebene Parameter ist immer noch die Klasse, die diesem Objekt entspricht.4133de66e39980eb57623002c4a0aef5
# 🎜 🎜#
192.168.0.5:3306 abc/123456
Operate_database().connect() # 输出结果一致 #输出 <class '__main__.Operate_database'> 192.168.0.5:3306 abc/1234562. Unverbindliche Methoden Mit @staticmethod innerhalb einer Klasse geänderte Methoden sind unverbindliche Methoden. Dieser Methodentyp unterscheidet sich nicht von einer gewöhnlichen definierten Funktion. Es ist nicht an eine Klasse oder ein Objekt gebunden, jeder kann es aufrufen und es gibt keinen automatischen Wertübertragungseffekt.
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) #输出 0659c7992e268962384eb17fafe88364Kurz gesagt besteht die ungebundene Methode darin, die gewöhnliche Methode in die Klasse einzufügen. 3. Übung Angenommen, wir haben jetzt die Anforderung, dass die von MySQL instanziierten Objekte Daten aus der Datei „settings.py“ lesen müssen.
# 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:33071 Zusammenfassung der BindungsmethodenWenn der Funktionskörpercode eine externe Klasse verwenden muss, sollte die Funktion als an die Klasse gebundene Methode definiert werden#🎜🎜 #
Wenn der Funktionskörpercode ein externes Objekt verwenden muss, sollte die Funktion als an das Objekt gebundene Methode definiert werden
# 一种新的实例化方式:从配置文件中读取配置完成实例化 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'>>
2 Zusammenfassung der unverbindlichen Methoden
# 🎜 🎜#Wenn der Funktionskörpercode weder eine externe Klasse noch ein externes Objekt erfordert, sollte die Funktion als nicht gebundene Methode/gewöhnliche Funktion definiert werdenobj.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
Das obige ist der detaillierte Inhalt vonWas sind die Bindungs- und Entbindungsmethoden von Klassen und Objekten in Python?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!