Bagaimanakah Saya Boleh Menggunakan Penghias `property()` dengan Classmethods dalam Python?

Patricia Arquette
Lepaskan: 2024-11-27 00:48:14
asal
835 orang telah melayarinya

How Can I Use the `property()` Decorator with Classmethods in Python?

Menggunakan property() pada Classmethods

Python menyediakan penghias property() untuk mencipta atribut baca sahaja atau baca-tulis yang dikira secara dinamik. Walau bagaimanapun, apabila digabungkan dengan kaedah kelas, pendekatan ini menghadapi beberapa had.

Dalam Python versi 3.8 dan lebih baharu, penghias property() boleh digunakan pada kaedah kelas secara langsung, membenarkan akses ringkas kepada atribut kelas:

class Foo:
    _var = 5
    @classmethod
    @property
    def var(cls):
        return cls._var

    @classmethod
    @var.setter
    def var(cls, value):
        cls._var = value
Salin selepas log masuk

Walau bagaimanapun, dalam Python 2 dan versi Python 3 sebelum 3.8, pendekatan berbeza diperlukan. Memandangkan sifat ditakrifkan pada kejadian, menggunakannya dengan kaedah kelas melibatkan mencipta harta pada metaclass kelas:

class Foo(object):
    _var = 5

    class __metaclass__(type):
        def __init__(cls, name, bases, dict):
            super().__init__(name, bases, dict)
            cls.var = property(cls.getvar, cls.setvar)

        @classmethod
        def getvar(cls):
            return cls._var

        @classmethod
        def setvar(cls, value):
            cls._var = value
Salin selepas log masuk

Dalam contoh ini, __metaclass__ mentakrifkan harta pada metaclass, yang kemudiannya diwarisi oleh tika Kelas Foo.

Sebagai alternatif, anda boleh menggunakan parameter metaclass untuk menentukan tersuai metaclass:

class FooMeta(type):
    def __init__(cls, name, bases, dict):
        super().__init__(name, bases, dict)
        cls._var = 5
        cls.var = property(cls.getvar, cls.setvar)

    @classmethod
    def getvar(cls):
        return cls._var

    @classmethod
    def setvar(cls, value):
        cls._var = value

class Foo(metaclass=FooMeta):
    pass
Salin selepas log masuk

Dalam persediaan ini, metaclass memulakan atribut _var dan mentakrifkan sifat var. Kejadian Foo akan mewarisi sifat var dan boleh mengakses atribut _var dengan sewajarnya.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan Penghias `property()` dengan Classmethods 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan