Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah anda Menambah Hartanah secara Dinamik ke Kelas dalam Python?

Bagaimanakah anda Menambah Hartanah secara Dinamik ke Kelas dalam Python?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-09 06:44:02382semak imbas

How do you Dynamically Add Properties to Classes in Python?

Penambahan Harta Dinamik dalam Python

Dalam Python, penambahan sifat dinamik pada kelas memberikan cabaran yang unik. Pada mulanya, seseorang mungkin cuba menambah sifat secara langsung ke contoh kelas menggunakan setattr. Walau bagaimanapun, pendekatan ini menetapkan objek sifat kepada atribut, mengalahkan tingkah laku yang diingini.

Penyelesaian

Untuk menambah sifat secara dinamik, ia mesti ditambah terus pada kelas itu sendiri. Pertimbangkan contoh berikut:

class Foo(object):
    pass

foo = Foo()
foo.a = 3

# Dynamically add property 'b' to class
Foo.b = property(lambda self: self.a + 1)

print(foo.b)  # Outputs 4

Memahami Deskriptor

Sifat dalam Python dilaksanakan menggunakan deskriptor. Deskriptor ialah objek yang mengendalikan akses atribut pada kelas tertentu. Mereka mempunyai kaedah get__, __set__, atau __delete yang mentakrifkan cara atribut itu diakses, ditetapkan atau dipadamkan.

Python memanggil Foo.b.__get__(foo, Foo) apabila mengakses foo. b, dan nilai pulangan menjadi nilai atribut. Dalam kes ini, deskriptor sifat memanggil kaedah fgetnya, melepasi nilai tika itu.

Objek Kaedah sebagai Deskriptor

Kaedah itu sendiri ialah jenis deskriptor yang lain. Kaedah get mereka menambah contoh panggilan sebagai hujah pertama, mengikatnya secara berkesan pada contoh.

Ringkasnya, penambahan sifat dinamik dalam Python memerlukan melampirkan harta itu pada kelas itu sendiri, memanfaatkan Python sistem deskriptor. Ini membenarkan pengendalian tersuai bagi atribut berdasarkan setiap kelas.

Atas ialah kandungan terperinci Bagaimanakah anda Menambah Hartanah secara Dinamik ke Kelas dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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