클래스 내 클래스의 속성 변경 가로채기 - Python
-
21-08-2019 - |
문제
나는 파이게임과 파이썬을 가지고 장난을 치고 있는데 내 클래스의 속성이 변경되었을 때 함수를 호출할 수 있기를 원합니다.내 현재 솔루션은 다음과 같습니다.
class ExampleClass(parentClass):
def __init__(self):
self.rect = pygame.rect.Rect(0,0,100,100)
def __setattr__(self, name, value):
parentClass.__setattr__(self,name,value)
dofancystuff()
Firstclass = ExampleClass()
이것은 잘 작동하고 다음과 같이 ret 값을 변경할 때 dofancystuff가 호출됩니다. Firsclass.rect = pygame.rect.Rect(0,0,100,100)
.그러나 내가 말하면 Firstclass.rect.bottom = 3
. __setattr__
그리고 거기에는 dofancystuff가 호출되지 않습니다.
그래서 내 질문은 하위 클래스의 속성에 대한 변경 사항을 어떻게 가로챌 수 있는가 하는 것입니다.
편집하다:또한 내가 이 문제에 대해 잘못된 방향으로 가고 있다면 내가 파이썬에 관해 잘 알지 못한다고 말해주세요.
해결책
글쎄, 간단한 대답은 당신이 할 수 없다는 것입니다. 의 경우 Firstclass.rect = <...>
당신의 __setattr__
호출됩니다. 그러나의 경우 Firstclass.rect.bottom = 3
그만큼 __setattr__
RELT 인스턴스의 메소드가 호출됩니다. 내가 보는 유일한 해결책은 파생 된 클래스의 pygame.rect.rect를 덮어 쓰는 곳을 만드는 것입니다. __setattr__
방법. 당신은 또한 직장 클래스를 패치 할 수 있지만, 이것은 좋은 이유로 낙담합니다.
다른 팁
당신은 시도해 볼 수 있습니다 __getattr__
, 호출되어야 함 Firstclass.rect
.
하지만 대신 이렇게 하세요:별도의 클래스(하위 클래스)를 만듭니다. pygame.rect
?) 을 위한 ExampleClass.rect
.구현하다 __setattr__
그 수업에서.이제 당신은 당신의 설정에 설정되는 모든 것에 대해 듣게 될 것입니다 rect
회원 ExampleClass
.여전히 구현할 수 있습니다 __setattr__
~에 ExampleClass
(그리고 ~해야 한다), 이제는 자신만의 버전을 인스턴스화해야 합니다. rect
수업...
지금:개체를 호출하지 마세요 Firstclass
, 그러면 객체가 아닌 클래스처럼 보입니다.
이것은 질문에 대답하지 않지만 관련이 있습니다.
self.__dict__[name] = value
아마도 아마도 더 낫습니다
parentClass.__setattr__(self, name, value)
Python 문서 (stattr "> http://docs.python.org/2/reference/datamodel.html?highlight=setattr#object에서 권장합니다.setattr) 그리고 일반적인 경우에 더 의미가 있습니다. setattr.
원치 않는 조언에 대한 예 4 년이 너무 늦었습니다!
나는 당신 이이 어려움을 겪는 이유가 다른 답변에서 제공하는 것보다 약간 더 많은 정보를받을 자격이 있다고 생각합니다.
문제는 당신이 할 때입니다.
myObject.attribute.thing = value
속성에 값을 할당하지 않습니다. 코드는 다음과 같습니다.
anAttribute = myObject.attribute
anAttribute.thing = value
MyObject에서 볼 수 있듯이 속성을 얻는 모든 일입니다. 속성을 설정하지 않습니다.
제어하는 속성의 서브 클래스를 만들고 __setattr__를 정의 할 수있는 것은 하나의 솔루션입니다.
다른 유형의 속성이 많고 그들 모두에 대해 많은 개별 서브 클래스를 만들고 싶지 않은 경우에 맞는 대체 솔루션은 __getAttribute__ 또는 __getattr__를 재정의하는 것입니다. __setattr__ 방법의 작업. 나는 이것을 직접 시도하지 않았지만, 당신은 어떤 물건의 외관 역할을 할 간단한 외관 수업을 만들 수 있어야한다고 생각합니다.
선택에주의를 기울여야합니다. __getattribute__ 그리고 __getattr__. 정보는 이전 문장에 링크 된 문서를 참조하지만 기본적으로 __getattr__가 사용되는 경우 실제 속성은 상단에 캡슐화/난독 화되어 __getattr__가 요청을 처리하고 __getAttribute__가 사용되면 속성을 검색해야합니다. 기본 클래스에 대한 호출을 통해.
당신이하려는 모든 것이 일부 직장이 업데이트되었는지 확인하는 것만 큼 과잉입니다.