문제

나는 파이게임과 파이썬을 가지고 장난을 치고 있는데 내 클래스의 속성이 변경되었을 때 함수를 호출할 수 있기를 원합니다.내 현재 솔루션은 다음과 같습니다.

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__가 사용되면 속성을 검색해야합니다. 기본 클래스에 대한 호출을 통해.

당신이하려는 모든 것이 일부 직장이 업데이트되었는지 확인하는 것만 큼 과잉입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top