將property() 與classmethod 結合使用:探索
在Python 中,property() 函數在創建getter 和setter 方面起著至關重要的作用對於類別屬性。但是,嘗試將 property() 與使用 @classmethod 裝飾器裝飾的類別方法一起使用可能會導致意外錯誤。
讓我們考慮以下說明該問題的程式碼片段:
class Foo(object): _var = 5 @classmethod def getvar(cls): return cls._var @classmethod def setvar(cls, value): cls._var = value var = property(getvar, setvar)
當嘗試存取或設定Foo 類別實例上的var 屬性時,我們遇到了錯誤:
>>> f = Foo() >>> f.getvar() 5 >>> f.setvar(4) >>> f.getvar() 4 >>> f.var Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'classmethod' object is not callable
如文件和堆疊溢位討論中所述[Python 類別方法作為Setter 和Getter](https://stackoverflow.com/questions/27906399/python-class-method-as -setter-and-getter),在Python 3.8 中不可能將property() 函數與類別方法一起使用
但是,還有其他方法可以實現所需的功能:
對於Python 2 和Python 3(包括3.9-3.10):
由於屬性影響實例,而類別屬性是在類別上建立的,因此需要在類別上建立屬性元類別。
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)
對於3.9 及以上的Python 版本:
更簡潔的解決方案是將類別方法移至元類別並直接在元類別上聲明屬性:
class Foo_meta(type): @property def var(cls): return cls._var @var.setter def var(cls, value): cls._var = value class Foo(metaclass=Foo_meta): _var = 5
這些替代方法有效地允許使用類別層級屬性。
以上是為什麼我不能在 Python 中將 `property()` 與類別方法一起使用,解決方法是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!