Cara Membuat Harta Kelas
Harta kelas ialah cara mudah untuk mengakses atribut melalui kelas itu sendiri dan bukannya melalui kejadian kelas. Dalam Python, kaedah boleh ditambah pada kelas menggunakan penghias @classmethod, tetapi tiada penghias sedemikian untuk sifat. Walau bagaimanapun, kesan yang serupa boleh dicapai melalui kelas deskriptor tersuai.
Kelas Deskriptor Tersuai
Kod berikut mentakrifkan kelas deskriptor tersuai, ClassPropertyDescriptor, yang membolehkan penciptaan sifat kelas:
class ClassPropertyDescriptor(object): def __init__(self, fget, fset=None): self.fget = fget self.fset = fset def __get__(self, obj, klass=None): if klass is None: klass = type(obj) return self.fget.__get__(obj, klass)() def __set__(self, obj, value): if not self.fset: raise AttributeError("can't set attribute") type_ = type(obj) return self.fset.__get__(obj, type_)(value) def setter(self, func): if not isinstance(func, (classmethod, staticmethod)): func = classmethod(func) self.fset = func return self
Penghias Harta Kelas
Untuk memudahkan penciptaan sifat kelas, sifat kelas fungsi penghias ditakrifkan:
def classproperty(func): if not isinstance(func, (classmethod, staticmethod)): func = classmethod(func) return ClassPropertyDescriptor(func)
Contoh Penggunaan
Kod berikut menunjukkan cara menggunakan penghias harta kelas untuk menentukan sifat kelas bernama bar dalam kelas Bar:
class Bar(object): _bar = 1 @classproperty def bar(cls): return cls._bar @bar.setter def bar(cls, value): cls._bar = value
Metaclass
Untuk membenarkan tetapan langsung sifat kelas melalui kelas, definisi metaclass, ClassPropertyMetaClass, digunakan:
class ClassPropertyMetaClass(type): def __setattr__(self, key, value): if key in self.__dict__: obj = self.__dict__.get(key) if obj and type(obj) is ClassPropertyDescriptor: return obj.__set__(self, value) return super(ClassPropertyMetaClass, self).__setattr__(key, value)
Dengan menambahkan __metaclass__ pada definisi kelas Bar dan mengemas kini __set__ kaedah ClassPropertyDescriptor, keupayaan untuk menetapkan sifat kelas melalui kelas itu sendiri didayakan.
Atas ialah kandungan terperinci Bagaimana untuk mencipta sifat kelas dalam Python tanpa penghias khusus?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!