拦截类Python中类中属性的更改

2024-06-16 09:20:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在玩pygame和python,我希望能够在类的属性发生更改时调用函数。我目前的解决方案是:

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()

这很好,当我用Firsclass.rect = pygame.rect.Rect(0,0,100,100)更改rect值时,会调用dofancystuff。但是如果我说Firstclass.rect.bottom = 3__setattr__并且没有调用dofancystuff。在

所以我想我的问题是如何拦截子类属性的任何更改?在

编辑:另外,如果我用错误的方式来处理这个问题,请告诉我,我对python不是很了解。在


Tags: namerectself属性valuedef解决方案pygame
3条回答

好吧,简单的答案是你不能。在Firstclass.rect = <...>的情况下,你的__setattr__被调用。但是在Firstclass.rect.bottom = 3的情况下,将调用Rect实例的__setattr__方法。我看到的唯一解决方案是创建游戏.rect.rect其中重写__setattr__方法。您也可以对Rect类进行monkey-patch,但出于充分的原因,不鼓励这样做。在

您可以尝试__getattr__,它应该在Firstclass.rect上调用。在

但是要这样做:创建一个单独的类(子类pygame.rect?)对于ExampleClass.rect。在该类中实现__setattr__。现在您将被告知在rect成员中为ExampleClass设置的任何内容。您仍然可以在ExampleClass(而且应该)中实现__setattr__,只是现在确保实例化了您自己的rect类的一个版本。。。在

顺便说一句:不要调用你的对象Firstclass,因为这样看起来它就像一个类而不是一个对象。。。在

这不是在回答问题,但它是相关的:

self.__dict__[name] = value

可能比

^{pr2}$

这是Python文档(setattr“>;http://docs.python.org/2/reference/datamodel.html?highlight=setattr\object.setattr)并在一般情况下更有意义,因为它不假设parentClasssetattr的行为。在

你主动提出的建议太晚了四年!在

相关问题 更多 >