Menggunakan property() pada Classmethods
Python menyediakan penghias property() untuk mencipta atribut baca sahaja atau baca-tulis yang dikira secara dinamik. Walau bagaimanapun, apabila digabungkan dengan kaedah kelas, pendekatan ini menghadapi beberapa had.
Dalam Python versi 3.8 dan lebih baharu, penghias property() boleh digunakan pada kaedah kelas secara langsung, membenarkan akses ringkas kepada atribut kelas:
class Foo: _var = 5 @classmethod @property def var(cls): return cls._var @classmethod @var.setter def var(cls, value): cls._var = value
Walau bagaimanapun, dalam Python 2 dan versi Python 3 sebelum 3.8, pendekatan berbeza diperlukan. Memandangkan sifat ditakrifkan pada kejadian, menggunakannya dengan kaedah kelas melibatkan mencipta harta pada metaclass kelas:
class Foo(object): _var = 5 class __metaclass__(type): def __init__(cls, name, bases, dict): super().__init__(name, bases, dict) cls.var = property(cls.getvar, cls.setvar) @classmethod def getvar(cls): return cls._var @classmethod def setvar(cls, value): cls._var = value
Dalam contoh ini, __metaclass__ mentakrifkan harta pada metaclass, yang kemudiannya diwarisi oleh tika Kelas Foo.
Sebagai alternatif, anda boleh menggunakan parameter metaclass untuk menentukan tersuai metaclass:
class FooMeta(type): def __init__(cls, name, bases, dict): super().__init__(name, bases, dict) cls._var = 5 cls.var = property(cls.getvar, cls.setvar) @classmethod def getvar(cls): return cls._var @classmethod def setvar(cls, value): cls._var = value class Foo(metaclass=FooMeta): pass
Dalam persediaan ini, metaclass memulakan atribut _var dan mentakrifkan sifat var. Kejadian Foo akan mewarisi sifat var dan boleh mengakses atribut _var dengan sewajarnya.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan Penghias `property()` dengan Classmethods dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!