@foo는 왜.파이썬의 세터는 나에게 맞지 않습니까?
그래서 저는 파이썬 2.6의 장식가들과 놀고 있는데, 그들을 일을 시키는데 어려움을 겪고 있습니다.다음은 제 수업 파일입니다.
class testDec:
@property
def x(self):
print 'called getter'
return self._x
@x.setter
def x(self, value):
print 'called setter'
self._x = value
내가 생각한 의미는 치료하는 것입니다.x
속성처럼, 그러나 이러한 함수를 get and set에 호출합니다.그래서 IDLE을 실행하고 확인했습니다.
>>> from testDec import testDec
from testDec import testDec
>>> t = testDec()
t = testDec()
>>> t.x
t.x
called getter
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "testDec.py", line 18, in x
return self._x
AttributeError: testDec instance has no attribute '_x'
>>> t.x = 5
t.x = 5
>>> t.x
t.x
5
제가 getter를 호출하기 때문에 첫 번째 통화는 예상대로 작동하고 기본값은 없으며 실패합니다.네, 좋습니다. 이해합니다.그러나 할당할 호출은t.x = 5
새로운 속성을 만드는 것 같습니다.x
그리고 이제 게터는 작동하지 않습니다!
제가 무엇을 빠뜨리고 있나요?
당신은 파이썬 2에서 고전적인 구식 수업을 사용하고 있는 것 같습니다.속성이 제대로 작동하려면 새 스타일 클래스를 대신 사용해야 합니다(python 2에서는 에서 상속해야 함).수업을 다음과 같이 선언합니다.MyClass(object)
:
class testDec(object):
@property
def x(self):
print 'called getter'
return self._x
@x.setter
def x(self, value):
print 'called setter'
self._x = value
작동합니다.
>>> k = testDec()
>>> k.x
called getter
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/devel/class_test.py", line 6, in x
return self._x
AttributeError: 'testDec' object has no attribute '_x'
>>> k.x = 5
called setter
>>> k.x
called getter
5
>>>
문제가 발생할 수 있는 또 다른 세부 사항은 두 방법 모두 속성이 작동하려면 동일한 이름이 필요하다는 것입니다.이렇게 다른 이름으로 세터를 정의하면 작동하지 않습니다.
@x.setter
def x_setter(self, value):
...
그리고 한 가지 더 처음에 완전히 발견하기 쉽지 않은 것은 순서입니다.게터를 먼저 정의해야 합니다.세터를 먼저 정의하면 다음과 같이 됩니다.name 'x' is not defined
오류
여기서 이 예외를 찾는 다른 사람들을 위한 메모입니다. 두 기능 모두 동일한 이름을 가져야 합니다.메서드 이름을 다음과 같이 지정하면 예외가 발생합니다.
@property
def x(self): pass
@x.setter
def x_setter(self, value): pass
대신 두 메서드에 동일한 이름을 지정합니다.
@property
def x(self): pass
@x.setter
def x(self, value): pass
선언의 순서가 중요하다는 점도 유의해야 합니다.파일의 세터 앞에 게터를 정의해야 합니다. 그렇지 않으면 다음과 같은 정보를 얻을 수 있습니다.NameError: name 'x' is not defined
객체에서 클래스를 파생하여 수행하는 새 스타일 클래스를 사용해야 합니다.
class testDec(object):
....
그러면 효과가 있을 겁니다.
구글에서 여기로 오는 사람이 있을 경우, 위의 답변 외에도 세터를 호출할 때 신중한 주의가 필요하다는 것을 추가하고 싶습니다.__init__
이 답변을 기반으로 한 클래스의 방법 구체적으로:
class testDec(object):
def __init__(self, value):
print 'We are in __init__'
self.x = value # Will call the setter. Note just x here
#self._x = value # Will not call the setter
@property
def x(self):
print 'called getter'
return self._x # Note the _x here
@x.setter
def x(self, value):
print 'called setter'
self._x = value # Note the _x here
t = testDec(17)
print t.x
Output:
We are in __init__
called setter
called getter
17
언급URL : https://stackoverflow.com/questions/598077/why-does-foo-setter-in-python-not-work-for-me
'source' 카테고리의 다른 글
What does it mean to squash commits in git? (0) | 2023.07.18 |
---|---|
Python의 람다 식 내부 할당 (0) | 2023.07.18 |
가져오기 오류: win32api라는 이름의 모듈이 없습니다. (0) | 2023.07.18 |
일치하는 키에서 값을 수집하여 딕트를 병합하는 방법은 무엇입니까? (0) | 2023.07.18 |
문자열에 지정된 변수의 이름을 가져오는 방법은 무엇입니까? (0) | 2023.07.18 |