Rumah > pembangunan bahagian belakang > Tutorial Python > Bagaimanakah anda menambah sifat ke kelas secara dinamik dalam Python?

Bagaimanakah anda menambah sifat ke kelas secara dinamik dalam Python?

Patricia Arquette
Lepaskan: 2024-11-09 22:40:02
asal
638 orang telah melayarinya

How do you add properties to a class dynamically in Python?

Cara Menambah Harta pada Kelas Secara Dinamik

Masalah

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
Salin selepas log masuk

Penyelesaian

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
Salin selepas log masuk

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>
Salin selepas log masuk

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)
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan