Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah Saya Boleh Menggunakan Penghias `property()` dengan Classmethods dalam Python?

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

Patricia Arquette
Patricia Arquetteasal
2024-11-27 00:48:14849semak imbas

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

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

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

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!

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