我一直在玩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不是很了解。在
好吧,简单的答案是你不能。在
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
,因为这样看起来它就像一个类而不是一个对象。。。在这不是在回答问题,但它是相关的:
可能比
^{pr2}$这是Python文档(setattr“>;http://docs.python.org/2/reference/datamodel.html?highlight=setattr\object.setattr)并在一般情况下更有意义,因为它不假设parentClasssetattr的行为。在
你主动提出的建议太晚了四年!在
相关问题 更多 >
编程相关推荐