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

Bolehkah Sifat Kelas Ditakrifkan Dengan Penghias dalam Python?

DDD
Lepaskan: 2024-11-11 04:08:03
asal
998 orang telah melayarinya

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
Salin selepas log masuk

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)
Salin selepas log masuk

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
Salin selepas log masuk

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
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan