首頁 > 後端開發 > Python教學 > 為什麼我不能在 Python 中將 `property()` 與類別方法一起使用,解決方法是什麼?

為什麼我不能在 Python 中將 `property()` 與類別方法一起使用,解決方法是什麼?

DDD
發布: 2024-12-12 21:28:12
原創
265 人瀏覽過

Why Can't I Use `property()` with Classmethods in Python, and What Are the Workarounds?

將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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板