Bagaimana untuk mencipta sifat kelas dalam Python tanpa penghias khusus?

Patricia Arquette
Lepaskan: 2024-11-07 15:22:03
asal
410 orang telah melayarinya

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

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

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

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

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!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!