截获类中类的属性更改-Python

截获类中类的属性更改-Python,python,class,attributes,subclass,pygame,Python,Class,Attributes,Subclass,Pygame,我一直在玩弄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) dof

我一直在玩弄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,0100100)
更改rect值时,会调用dofancystuff。但是如果我说
Firstclass.rect.bottom=3
<代码>\uuuu setattr\uuuu并且没有调用dofancystuff

所以我想我的问题是,我怎样才能截获对子类属性的任何更改


编辑:如果我用了错误的方法,请告诉我,我对python不是很了解。

你可以试试
\uuuu getattr\uuuu
,应该在
Firstclass.rect
上调用它

但是要这样做:为
ExampleClass.rect
创建一个单独的类(pygame.rect的子类)。在该类中实现
\uuuuu setattr\uuuuu
。现在,您将了解在
ExampleClass
rect
成员中设置的任何内容。您仍然可以在
ExampleClass
中实现
\uuuuuuu setattr\uuuuuuuuu
(并且应该),现在只需确保实例化自己的
rect
类的一个版本


顺便说一句:不要称你的对象为第一类,因为它看起来像是一个类而不是一个对象……

好吧,简单的答案是你不能。在
Firstclass.rect=
的情况下,将调用您的
\uuuu setattr\uuuu
。但是在
Firstclass.rect.bottom=3
的情况下,将调用rect实例的
\u setattr\u
方法。我看到的唯一解决方案是创建pygame.rect.rect的派生类,在其中覆盖
\uuu setattr\uu
方法。您也可以对Rect类进行monkey补丁,但出于充分的理由,不鼓励这样做。

我认为,与其他答案相比,您遇到这种困难的原因应该得到更多的信息

问题是,当您这样做时:

myObject.attribute.thing = value
您没有为属性指定值。代码与此等效:

anAttribute = myObject.attribute
anAttribute.thing = value
正如myObject所看到的,您所做的一切都是为了获得属性;您没有设置属性

一种解决方案是为您控制的属性创建子类,并为其定义_usetattr__;

如果您有许多不同类型的属性,并且不想为所有这些属性创建许多单独的子类,那么另一种解决方案可能是重写uuu getattribute_uuuuuu或uuu getattr_uuuuuu,以返回属性的外观,该属性在其uu setattr_uuuuu方法中执行相关操作。我自己并没有尝试过这样做,但我认为您应该能够创建一个简单的facade类,它将充当任何对象的facade

在选择和时需要小心。有关信息,请参阅前一句中链接的文档,但基本上如果使用了uuu getattr uuu,实际属性将以某种方式进行封装/模糊处理,以便uuu getattr u处理它们的请求,如果使用了uuu getattribute u,则必须通过调用基类来检索属性


如果您所要做的只是确定某些RECT是否已更新,那么这就太过分了。

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

self.__dict__[name] = value
可能比

parentClass.__setattr__(self, name, value)
Python文档(setattr“>http://docs.python.org/2/reference/datamodel.html?highlight=setattr#object.setattr),并且在一般情况下更有意义,因为它不假设任何关于父类的行为setattr


太晚了四年才收到你的建议了!

+1:创建你自己的矩形子类,并将其用于所有事情。你真正想要的可能是一个观察点,但AFAIK pdb还不支持此功能。