Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk mencipta sifat kelas dalam Python tanpa penghias khusus?

Bagaimana untuk mencipta sifat kelas dalam Python tanpa penghias khusus?

Patricia Arquette
Patricia Arquetteasal
2024-11-07 15:22:03559semak imbas

How to create class properties in Python without a dedicated decorator?

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!

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