source

@foo는 왜.파이썬의 세터는 나에게 맞지 않습니까?

factcode 2023. 7. 18. 22:01
반응형

@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

반응형