2016-05-26 105 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))