Rumah >pembangunan bahagian belakang >Tutorial Python >Apakah kaedah mengikat dan tidak mengikat kelas dan objek dalam Python
Kaedah yang ditakrifkan dalam kelas boleh dibahagikan secara kasar kepada dua kategori: kaedah terikat dan kaedah tidak terikat. Kaedah mengikat boleh dibahagikan kepada kaedah terikat kepada objek dan kaedah terikat kepada kelas.
Kaedah yang tidak diubah suai oleh mana-mana penghias dalam kelas ialah kaedah terikat pada objek ini disesuaikan khusus untuk objek.
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 ialah kaedah yang terikat pada objek Kaedah ini bukan dalam ruang nama objek, tetapi dalam ruang nama kelas.
Apabila memanggil kaedah yang terikat pada objek melalui objek, akan ada proses pemindahan nilai automatik, iaitu objek semasa secara automatik dihantar ke parameter pertama kaedah (diri, biasanya dipanggil diri, atau ia juga boleh ditulis sebagai nama lain); jika ia dipanggil menggunakan kelas, parameter pertama perlu dihantar secara manual.
p = Person('Kitty', 18) p.speak() # 通过对象调用 #输出 Kitty, 18 Person.speak(p) # 通过类调用 #输出 Kitty, 18
Kaedah yang diubah suai oleh @classmethod ialah kaedah kelas, iaitu kaedah yang terikat kepada kelas dan bukannya kejadian. Kaedah jenis ini disesuaikan khusus untuk kelas. Apabila anda memanggil kaedah terikat kepada kelas, kelas itu sendiri diluluskan sebagai hujah pertama kepada kaedah tersebut.
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
pass>ba3aaa4a350dee5f67fe7e3481745a82
192.168.0.5:3306 abc/123456
objek Ia boleh dipanggil, tetapi parameter pertama yang diluluskan secara lalai masih merupakan kelas yang sepadan dengan objek ini.
Operate_database().connect() # 输出结果一致 #输出 <class '__main__.Operate_database'> 192.168.0.5:3306 abc/123456
Kaedah yang diubah suai dengan @staticmethod di dalam kelas ialah kaedah tidak terikat Kaedah ini tidak berbeza daripada fungsi yang ditetapkan biasa dan tidak berbeza daripada kelas atau Objek mengikat boleh dipanggil oleh sesiapa sahaja, dan tiada kesan pemindahan nilai automatik.
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) #输出 f7a1cc409ed6f51058c2b4a94a7e1956rrree
Ringkasnya, kaedah tidak terikat ialah kaedah biasa yang diletakkan di dalam kelas.
Andaikan kita kini mempunyai keperluan bahawa objek yang dibuat instantiated oleh Mysql boleh membaca data daripada tetapan fail.py.
p = Operate_database('192.168.0.5', '3306', 'abc', '123456') hash_password = p.get_passwrod(p.user, p.password) # 也可以通过对象调用 print(hash_password) #输出 0659c7992e268962384eb17fafe88364
# 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)
Jika kod badan fungsi perlu menggunakan kelas luaran, fungsi itu hendaklah ditakrifkan sebagai kaedah terikat kepada kelas
Jika Jika Jika kod badan fungsi perlu menggunakan objek luaran, fungsi harus ditakrifkan sebagai kaedah terikat pada objek
obj.tell_info() 10.10.0.9:3307
Jika kod badan fungsi tidak memerlukan sama ada Jika kelas yang diluluskan dari luar tidak memerlukan objek yang dihantar dari luar, fungsi itu hendaklah ditakrifkan sebagai kaedah tidak terikat/fungsi biasa
# 一种新的实例化方式:从配置文件中读取配置完成实例化 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'>>
Atas ialah kandungan terperinci Apakah kaedah mengikat dan tidak mengikat kelas dan objek dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!