如何使每个类方法在执行之前调用指定的方法?
问题内容:
我想让我的Python类表现为某种方式,使得在调用任何类方法时,将首先执行默认方法,而无需在被调用类中明确指定此方法。一个例子可能会有所帮助:)
Class animals:
def _internalMethod():
self.respires = True
def cat():
self._internalMethod()
self.name = 'cat'
def dog():
self._internalMethod()
self.name = 'dog'
我希望从动物实例中调用任何方法时都自动调用_internalMethod(),而不是在每种方法的def中明确声明。有没有一种优雅的方法可以做到这一点?
干杯,
问题答案:
您可以使用元类和
getattribute
动态地修饰所有方法(如果您使用的是Python 2,请确保从object
!
继承
子类)。
另一种选择是对类进行修复,例如:
def add_method_call(func, method_name):
def replacement(self, *args, **kw):
getattr(self, method_name)()
return func(self, *args, **kw)
return replacement
def change_all_attrs(cls, added_method):
for method_name in dir(cls):
attr = getattr(cls, method_name)
if callable(attr):
setattr(cls, method_name, add_method_call(attr, added_method))
class animals(object):
...
change_all_attrs(animals, '_internalMethod')
这有点草率,dir()
不会在超类中获得任何方法,并且由于简单的callable(attr)
测试,您可能会捕获不想要的属性和其他对象。但这可能对您有用。
如果使用Python
2.7+,则可以使用类装饰器,而不是change_all_attrs
在创建类后调用,但是效果是相同的(除非您必须重写change_all_attrs
以使其成为装饰器)。