2 回答

TA贡献1830条经验 获得超3个赞
如果您使用的是 Python 版本 >= 3.6,您可以编写一个类的__init_subclass__方法Base,将__call__子类的属性分配为其fn属性:
class Base:
def fn(self, *args):
return args
__call__ = fn
def __init_subclass__(cls):
cls.__call__ = cls.fn
class Derived(Base):
def fn(self, arg):
print("In derived")
return arg
Base()(1, 2, 3)
# (1, 2, 3)
Derived()(1)
# In derived
# 1
如果您使用的是旧版本的 Python,您可以使用元类实现类似的效果。
class BaseMeta(type):
def __init__(cls, *args, **kwargs):
super().__init__(*args, **kwargs)
cls.__call__ = cls.fn
class Base(metaclass=BaseMeta):
def fn(self, *args):
return args
class Derived(Base):
def fn(self, arg):
print("In derived")
return arg

TA贡献1785条经验 获得超4个赞
在您提供的示例中,无需使用__call__
. 已经有一个非常好的机制,因为python会调用类构造函数。如此简单,def __init__(self, *args):
并根据需要调用该代码fn
。
您提到了不同的参数列表,但没有描述如何区分它们。如果它是一个简单的标准,例如len(args)
,那么您所拥有的就足够了。如果它更复杂,您可能想要放入**kwargs
签名,并让每个方法只挑选它识别的关键字参数。
添加回答
举报