2010-01-31 5 views
8

은 몇 가지 이유로 작동하지 않습니다 다음파이썬에서 클래스 속성을 만들 수있는 방법이 있습니까?

>>> class foo(object): 
...  @property 
...  @classmethod 
...  def bar(cls): 
...    return "asdf" 
... 
>>> foo.bar 
<property object at 0x1da8d0> 
>>> foo.bar + '\n' 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unsupported operand type(s) for +: 'property' and 'str' 

이 할 수있는 방법이 있나요, 또는 메타 클래스 속임수의 일종 리조트 내 유일한 대안은?

+1

파이썬의 '속성'에 익숙하지 않은 사용자에게 제이슨이 말하는 내용을 이해하는 데 도움이 될 수 있습니다. http://docs.python.org/library/functions.html#property – MatrixFrog

답변

6

개체 X에서 특성을 가져올 때 설명자 property을 표시하려면 설명자를 type(X)에 넣어야합니다. 따라서 X가 클래스 인 경우 설명자는 클래스의 메타 클래스라고도하는 클래스의 유형으로 이동해야합니다. "속임수"는 포함되지 않으며 완전히 일반적인 규칙의 문제 일뿐입니다.

또는 독자적인 특수 용도 설명자를 쓸 수도 있습니다. 설명자에 대한 훌륭한 "방법"조약은 here을 참조하십시오. 예 편집 : 원하는

class classprop(object): 
    def __init__(self, f): 
    self.f = classmethod(f) 
    def __get__(self, *a): 
    return self.f.__get__(*a)() 

class buh(object): 
    @classprop 
    def bah(cls): return 23 

print buh.bah 

23을 방출한다.

+0

나는 다른 곳에서 메타 클래스를 사용하고 있습니다. 상속 계층 구조이므로 메타 클래스를 사용하면 다음과 같은 결과를 얻습니다. '메타 클래스 충돌 : 파생 클래스의 메타 클래스가 모든 기본 메타 클래스의 (엄격하지 않은) 하위 클래스 여야합니다.' –

+0

* 그러나 * 매력처럼. 감사! –

+0

@Jason, 오류 메시지가 말하듯이 @ 관련된 모든 메타 클래스의 하위 클래스를 사용할 수도 있습니다 (여러 개의 사용자 정의 메타 클래스 또는'type'을 서브 클래스하지 않는 메타 클래스를 사용하는 경우는 거의 없으므로 하나의 사용자 정의 메타 클래스 만 서브 클래 싱해야합니다. 사용하고있다.) - 그러나 사용자 지정 설명자가 작업을 수행하는 경우 실제로는 더 간단한 방법 일 수 있습니다. –

관련 문제