Setter 속성 작동하지 않는 경우 특성으로 시작"__"?

0

질문

내가 사용하는 파이썬 3.8.6 과이

class A:
    @property
    def _a(self):
        return getattr(self, '_a_', 0)

    @_a.setter
    def _a(self, value):
        self._a_ = value


a = A()
print(a._a)  # prints 0
a._a = 10
print(a._a)  # prints 10 as expected

이 작동하지 않는

class A:
    @property
    def _a(self):
        return getattr(self, '__a', 0)

    @_a.setter
    def _a(self, value):
        self.__a = value

a = A()
print(a._a)  # prints 0
a._a = 10
print(a._a)  # prints 0 again

는 초! 유일한 차이 첫 번째와 두 번째 예는 개인 특성 __a_a_

이유가 무엇입니까? 할 수 있습니 그것을 알아내기

properties python
2021-11-20 09:49:15
1

최고의 응답

1

그것은으로 인해 프라이빗 이름 엉망으로,하지만 그는 적용되지 않는 내용의 문자열을 전달하기 getattr().

다행히도 해결은 간단하다:

class A:
    @property
    def _a(self):
        return getattr(self, '_A__a', 0)

    @_a.setter
    def _a(self, value):
        self.__a = value

a = A()
print(a._a)  # prints 0
a._a = 10
print(a._a)  # prints 10 now
2021-11-20 15:39:03

내가 생각하는 변형을 사용하여 classname 이 휴식을 위해 서브 클래스이기 때문에,세터에 기록된 기본 클래스의 속성 이름이 여전히 망가기 _A__a.
kaya3

@kaya3:"break"그것은 어떤 의미? 그것은 이름을 사용하의 서브 클래스에서는 하나입니다.
martineau

라우 class B(A): pass 다음 b = B(); b._a = 23; print(b._a) 인쇄 0 기 때문에 세터 기록 _A__a 하지만 게터에 액세스하려고 시도 _B__a.
kaya3

@kaya3:당신은 오,그래서 내가 제거된 부분의 내 대답이다.
martineau

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................