Rumah >pembangunan bahagian belakang >Tutorial Python >Bolehkah Sifat Kelas Ditakrifkan Dengan Penghias dalam Python?

Bolehkah Sifat Kelas Ditakrifkan Dengan Penghias dalam Python?

DDD
DDDasal
2024-11-11 04:08:031001semak imbas

Can Class Properties Be Defined With a Decorator in 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!

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