>백엔드 개발 >파이썬 튜토리얼 >`@classmethod` 데코레이팅된 메서드와 함께 `property()`를 사용하면 Python에서 오류가 발생하는 이유는 무엇입니까?

`@classmethod` 데코레이팅된 메서드와 함께 `property()`를 사용하면 Python에서 오류가 발생하는 이유는 무엇입니까?

DDD
DDD원래의
2024-11-27 05:46:17587검색

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

클래스 메소드와 함께 property() 사용

문제:

다음으로 장식된 클래스 메소드와 함께 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)

오류:

>>> 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

해결책:

Python 3.8 그리고 이후:

Python 3.8 이상에서는 @classmethod 데코레이팅된 함수와 함께 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)
>>> foo.var
5
>>> foo.var = 3
>>> foo.var
3

위 내용은 `@classmethod` 데코레이팅된 메서드와 함께 `property()`를 사용하면 Python에서 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.