Rumah > Artikel > pembangunan bahagian belakang > Bagaimanakah anda menambah sifat ke kelas secara dinamik dalam Python?
Anda menyasarkan untuk mencipta kelas tiruan yang meniru set hasil pangkalan data. Apabila pertanyaan pangkalan data kembali, misalnya, {'ab':100, 'cd':200}, anda menjangkakan untuk melihat:
>>> dummy.ab 100
Walaupun menambah harta pada kelas secara dinamik boleh dilaksanakan, ia mesti ditambah pada kelas itu sendiri.
>>> class Foo(object): ... pass ... >>> foo = Foo() >>> foo.a = 3 >>> Foo.b = property(lambda self: self.a + 1) >>> foo.b 4
Hartanah ialah pelaksanaan mudah bagi deskriptor, iaitu objek yang menyediakan pengendalian atribut tersuai pada kelas tertentu. Ia bertindak sebagai pengganti kepada pokok if ekstensif dalam __getattribute__.
Apabila anda meminta foo.b, Python mengenali bahawa b yang ditakrifkan pada kelas mengikut protokol deskriptor, yang hanya menunjukkan objek dengan kaedah get__, __set__ atau __delete. Deskriptor memikul tanggungjawab untuk mengendalikan atribut itu, mendorong Python untuk memanggil Foo.b.__get__(foo, Foo), dan nilai pulangan dikembalikan kepada anda sebagai nilai atribut. Dalam kes hartanah, setiap kaedah ini hanya menggunakan fget, fset atau fdel yang anda bekalkan kepada pembina hartanah.
Deskriptor ialah mekanisme Python untuk mendedahkan kerumitan pelaksanaan OO keseluruhannya. Secara kebetulan, terdapat jenis deskriptor yang berbeza yang lebih lazim daripada harta benda.
>>> class Foo(object): ... def bar(self): ... pass ... >>> Foo().bar <bound method Foo.bar of <__main__.Foo object at 0x7f2a439d5dd0>> >>> Foo().bar.__get__ <method-wrapper '__get__' of instancemethod object at 0x7f2a43a8a5a0>
Kaedah sederhana adalah satu lagi jenis deskriptor. getnya memberi awalan contoh panggilan sebagai hujah pertama; pada dasarnya, ia melakukan ini:
def __get__(self, instance, owner): return functools.partial(self.function, instance)
Ini berkemungkinan sebab deskriptor hanya digunakan pada kelas: mereka memformalkan mekanisme yang menyokong kelas pada mulanya. Mereka adalah pengecualian kepada peraturan: anda sudah pasti boleh menetapkan deskriptor kepada kelas, walaupun kelas itu sendiri adalah contoh jenis. Malah, percubaan untuk mendapatkan Foo.bar masih menggunakan hartanah.__get__; walau bagaimanapun, adalah simpulan bahasa bagi deskriptor untuk mengembalikan diri mereka sendiri apabila diakses sebagai atribut kelas.
Penerangan membolehkan majoriti sistem OO Python ditulis dalam Python itu sendiri.
Atas ialah kandungan terperinci Bagaimanakah anda menambah sifat ke kelas secara dinamik dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!