2014-02-16 3 views
4

는이 같은 클래스가 : 나는 How do Python properties work?, How to set a python property in __init__을 본 적이파이썬 속성 반환 속성 객체

class Foo(object): 
    def __init__(self): 
     self.bar = property(self.get_bar) 

    def get_bar(self): 
     return "bar" 

print Foo().bar #this prints <property object at 0x0051CB40> 

을,하지만 난 다른 이름을 원하기 때문에 그들은 모두 내가하지 데코레이터 방법을 사용합니다. 액세스 권한이 필요합니다. self

속성을 어떻게 작동합니까? 또한이 here을 보여 좋아 할 수

class Foo(object): 

    def get_bar(self): 
     return "bar" 

    bar = property(get_bar) 

print Foo().bar # prints bar 
+2

왜 다른 이름을 사용하고 싶습니까? 합당한 이유가 있습니까? –

+0

속성을 데코레이터 또는 문서화 문자열로 사용해 보셨습니까? –

+0

빠른 해결책은'bar '에'__get__'을 명시 적으로 호출하는 것입니다 :'f = Foo(); f.bar .__ get __ (f, type (f))' –

답변

4

처럼 그것을 할 수 있습니다 다음과 같음 :

class Also_Foo(object): 
    def __init__(self): 
     self._bar = None 

    def get_bar(self): 
     return self._bar 

    def set_bar(self, value): 
     self._bar = value 

    def del_bar(self): 
     self._bar = None # for instance 

    bar = property(fget=get_bar, fset=set_bar, fdel=del_bar, doc=None) 

BUT 각 특성에 대해 getset 메서드로 클래스 네임 스페이스를 오염시키지 않습니다.

.bar 대신 ._bar을 사용하여 변수에 대한 외부 직접 액세스를 유지합니다.

+0

get_bar가 정의되지 않았습니다. Idk 내가 뭘 잘못하고있다 – gcq

+0

나는 함수 앞에 속성을 정의하고 있었다. 괜찮아. – gcq

+0

@gcq 이제'bar'의 값을 설정하십시오. – thefourtheye

5

당신은 당신은 사소한 변경해야이

class Foo(object): 
    def __init__(self): 
     self.__bar = None 

    def get_bar(self): 
     return self.__bar 

    def set_bar(self, value): 
     self.__bar = value 

    bar = property(get_bar, set_bar) 

foo = Foo() 
print foo.bar # None 
foo.bar = 1 
print foo.bar # 1 
0

:

class Foo(object): 
    def __init__(self): 
     self._bar = None 

    @property 
    def bar(self): 
     return self._bar 

    @bar.setter 
    def bar(self, value): 
     self._bar = value 

    @bar.deleter 
    def bar(self): 
     self._bar = None # for instance 

입니다

-1

개체가 인스턴스화되지 않았습니다.

class Foo(object): 

def get_bar(self): 
    return "bar" 

bar = Foo() 
print(bar.get_bar)