gpt4 book ai didi

python - : a metaclass or a decorator? 类中所有实例方法调用后自动调用方法

转载 作者:太空宇宙 更新时间:2023-11-04 01:33:13 26 4
gpt4 key购买 nike

假设我有一个类

class Foo:
def __init__(self):
pass
def meth1(self, *args):
do_stuff()
def meth2(self, **kwargs):
more_stuff()
def callme(self):
print "I'm called!"

我想巧妙地修改它,以便在执行 meth1meth2 和其他所有内容后调用 callme()。我怎么做?我从未使用过类装饰器或元类,所以我不确定要走哪条路以及如何正确使用它们。

对于元类,我将以下内容放在一起:

from types import FunctionType
def addcall_meta(name, bases, dct):
newdct = dict(dct)
for k, v in dct.items():
if isinstance(v, FunctionType) and k not in ('__metaclass__', 'callme'):
# the above can include more filters such as not startswith, etc.
print k, 'is a function!'
def newmethod(self, *args, **kwargs):
v(self, *args, **kwargs)
dct['callme'](self)
newdct[k] = newmethod
return type(name, bases, newdct)

使用类装饰器:

def addcall_deco(cls):
dct = {}
for k, v in cls.__dict__.items():
if isinstance(v, FunctionType) and k != 'callme':
def newv(self, *args, **kwargs):
v(self, *args, **kwargs)
self.callme()
cls.k = newv
return cls

两者似乎都适用于我的 super 简单示例:

In [75]: Foo()
I'm called!
Out[75]: <__main__.Foo instance at 0x21ed680>

是否有明显的理由使用一个而不使用另一个(例如特定的极端情况等)?我还认为我可以以某种方式使用 __new__,但是从从常识的角度来看,我想修改类,而不是它的所有实例。

最佳答案

旧版本的 Python 不支持类装饰器,因此如果向后兼容性是一个问题,那么您将需要使用元类或将类装饰器转换为包装类的函数调用。

关于python - : a metaclass or a decorator? 类中所有实例方法调用后自动调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12229536/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com