Rumah >pembangunan bahagian belakang >Tutorial Python >Bolehkah Sifat Kelas Ditakrifkan Dengan Penghias dalam Python?
Sifat Kelas dalam Python
Dalam Python, kaedah kelas boleh ditambah menggunakan penghias @classmethod. Tetapi bagaimana dengan sifat kelas? Adakah terdapat penghias untuk mereka?
Pertimbangkan kod ini:
class Example(object): the_I = 10 def __init__(self): self.an_i = 20 @property def i(self): return self.an_i def inc_i(self): self.an_i += 1 # is this even possible? @classproperty def I(cls): return cls.the_I @classmethod def inc_I(cls): cls.the_I += 1
Kod mentakrifkan Contoh kelas dengan sifat instance i, sifat kelas I dan dua kaedah kelas inc_i dan inc_I .
Walau bagaimanapun, sintaks yang digunakan untuk @classproperty tidak betul dalam Python. Untuk mencipta harta kelas, kita boleh menggunakan pendekatan berikut:
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 def classproperty(func): if not isinstance(func, (classmethod, staticmethod)): func = classmethod(func) return ClassPropertyDescriptor(func)
Dengan kod pembantu ini, kita boleh menentukan sifat kelas seperti berikut:
class Bar(object): _bar = 1 @classproperty def bar(cls): return cls._bar @bar.setter def bar(cls, value): cls._bar = value
Penghias harta kelas mencipta deskriptor yang mengendalikan operasi get dan set untuk harta kelas.
Dengan menambahkan definisi metaclass, kita juga boleh mengendalikan tetapan harta kelas terus pada kelas:
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) Bar.__metaclass__ = ClassPropertyMetaClass
Kini, kedua-dua contoh dan sifat kelas boleh digunakan dan ditetapkan seperti yang diharapkan.
Atas ialah kandungan terperinci Bolehkah Sifat Kelas Ditakrifkan Dengan Penghias dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!