Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Menggunakan `property()` dengan Kaedah Berhias `@classmethod` Menyebabkan Ralat dalam Python?
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!