Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Menggunakan `property()` dengan Kaedah Berhias `@classmethod` Menyebabkan Ralat dalam Python?

Mengapa Menggunakan `property()` dengan Kaedah Berhias `@classmethod` Menyebabkan Ralat dalam Python?

DDD
DDDasal
2024-11-27 05:46:17529semak imbas

Why Does Using `property()` with `@classmethod` Decorated Methods Cause Errors in Python?

Menggunakan property() dengan Kaedah Kelas

Masalah:

Menggunakan fungsi property() dengan kaedah kelas yang dihiasi dengan penghias @classmethod menghasilkan ralat.

Contoh Pembiakan:

class Foo(object):
    _var = 5

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

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

    var = property(getvar, setvar)

Ralat:

>>> f = Foo()
>>> f.getvar()
5
>>> f.setvar(4)
>>> f.getvar()
4
>>> f.var
Traceback (most recent call last):
  File <stdin>, line 1, in ?
TypeError: 'classmethod' object is not callable
>>> f.var=5
Traceback (most recent call last):
  File <stdin>, line 1, in ?
TypeError: 'classmethod' object is not callable

Penyelesaian:

Python 3.8 dan Kemudian:

Dalam Python 3.8 dan lebih baru, adalah mungkin untuk menggunakan fungsi property() dengan fungsi dihiasi @classmethod. Hanya gunakan kedua-dua penghias pada kaedah tersebut.

Python 2 dan Python 3 (Berfungsi dalam 3.9-3.10 juga)

Sifat dicipta pada kelas tetapi mempengaruhi tika . Untuk mencipta sifat kaedah kelas, cipta sifat pada metaclass.

class foo(object):
    _var = 5
    
    class __metaclass__(type):  # Python 2 syntax for metaclasses
        pass

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

    @classmethod
    def setvar(cls, value):
        cls._var = value
    
>>> foo.__metaclass__.var = property(foo.getvar.im_func, foo.setvar.im_func)
>>> foo.var
5
>>> foo.var = 3
>>> foo.var
3

Atas ialah kandungan terperinci Mengapa Menggunakan `property()` dengan Kaedah Berhias `@classmethod` Menyebabkan Ralat 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