2016-05-26 113 views
0

我想在Python中实现一个类,其中修改其属性的子集导致调用特定的类方法。我发现Python提供了很多方法来实现我想要的东西,但我不确定哪种方法是最实用的Pythonic和简约方法。在Python类中拦截属性修改

举例来说,假设我们有一个属性xyzFoo,和我们感兴趣的拦截修改属性xy。每当有人拨打foo.x = ...foo.y = ...,我想要调用方法foo.bar。另外,我并不在乎是否必须为每个属性使用包装器,前提是这个包装器只能被写入一次,例如以某种方式拦截几乎不存在的方法foo.set_x(...)foo.set_y(...)def foo.set_member(self, member, value): ...

+0

所以,你想['__setattr__'](https://docs.python.org/3 /reference/datamodel.html#object.__setattr__)? – jonrsharpe

+0

@jonrsharpe正是我所需要的,我错过了解释如何在''''__setattr__'''函数内实际访问成员的部分。然而,事实证明有一个'''set_XXX'''方法(是方法名的'''''XXX'''部分被动态解析)将更适合我的需求。不幸的是,它看起来像Python并没有通过某种机制拦截方法调用给我一个机会,它立即失败,并带有''AttributeError'''。 – Thanos

回答

0

这实际上是在Python中的新类很容易的,建立在object类的顶部:

class Foo (object) : 

    def __setattr__ (self, name, value) : 
     self.bar(name, value) 
     object.__setattr__(self, name, value) 

    def bar (self, name, value) : 
     print('Setting {} to {}.'.format(name, value))