2016-10-25 6 views
0

저는 파이썬 초보자이며 @property 및 @property에 갇혀 있습니다. 세터 데코레이터. 세터를 사용하여 __content라는 사전에 데이터를 추가하고 싶습니다. 이것은 내 시도이지만이 스크립트를 실행하면 마지막 요소 만 사전에 추가됩니다! 그래서 나는 무엇을 여기에서 놓치고있다!파이썬 속성 및 파이썬 속성 설정자 유형 수정

class Something: 
    def __init__(self,elem): 
     self.__content={} 

     self.__content.update(elem) 
     print type(self.__content) 

    @property 
    def content(self): 
     return self.__content 

    @content.setter 
    def content(self,elem): 
     self.__content.update(elem) 

그리고

from transpose import Something 
c=Something(dict(one=4)) 
print c.content 
c.content=dict(two=6) 
print c.content 

결과

/usr/bin/python /home/radouani/PycharmProjects/demoPython/test.py 
<type 'dict'> 
{'one': 4} 
<type 'dict'> 
{'two': 6} 
Process finished with exit code 0 

또 다른 문제 : 내가 가진 튜플 또는 정수에 영향을하려고 할 때 파이썬은 __content의 유형을 변경 왜 이해가 안 돼요 세터 사용?

정중하게

+0

, 당신은'object' IE'클래스 뭔가 (객체)'에서 상속해야합니다 - Python3이 자동으로 수행됩니다 . – sytech

+1

Thaks 많이 작동합니다 :)하지만 무엇이 문제입니까? 왜 상속이 명백하지 않은가? –

+0

Python3에서, 이것은 당신을 위해 일어날 것입니다 - Python3의 모든 클래스는 "새로운 스타일"클래스입니다. "New Style"클래스는 Python2로 다시 포팅되었지만 "old style"클래스의 기능이 변경 되었기 때문에 Python2에서 새로운 스타일 클래스를 사용하도록 '옵트 인 (opt-in)'해야합니다. 파이썬 3에서는 하위 호환성을 위해이 상속을 명시 적으로 수행하는 것이 여전히 바람직하지만 필수는 아닙니다. 그 질문에 대답합니까? – sytech

답변

2

이전 스타일 클래스에서는 속성이 작동하지 않습니다.

class Something(object): 
    ... 

property doc에서 : 당신은 새로운 스타일의 클래스를 만드는 개체에서 상속해야

class property([fget[, fset[, fdel[, doc]]]])

반환 new-style class ES (객체에서 파생 클래스)에 대한 속성 속성을.

1

앞서 언급했듯이 "이전 스타일"클래스에서는 속성이 작동하지 않습니다. 속성이 작동하려면 Python 2.x에서 새로운 스타일 클래스를 생성하려면 object을 상속 받아야합니다.

class Something(object): 
    #stuff 

파이썬 3.x에서 이것은 당신을 위해 일어날 것입니다. 파이썬 3의 모든 클래스는 "새로운 스타일"클래스입니다. "New Style"클래스도 Python2에서 구현되지만, 그렇지 않으면 "old style"클래스의 기능이 변경 될 것이므로 object으로부터 상속 받아 Python2에서 새 스타일 클래스를 사용하도록 '옵트 인 (opt-in)'해야합니다.

비록 이것이 파이썬 3에서 암묵적으로 그리고 자동적으로 발생하지만, 하위 호환성을 위해 명시 적으로 object에서이 상속을하는 것이 여전히 바람직하다.

개발 클래스에 대한 좋은 자원 : 당신이 Python2를 사용하는 경우 Raymond Hettinger - Python's Class Development Toolkit