Python能否实现类实例任意调用都指向指定的默认函数?
实现方案
可以实现,核心用到Python的两个魔术方法__getattribute__和__call__即可覆盖所有属性访问、方法调用场景,同时支持无限链式调用。
完整实现代码
class Example: def __init__(self): self.parameter1 = 1 def standardFunction(self): print("Hello") # 所有属性访问都会触发该方法 def __getattribute__(self, name): # 调用默认逻辑,用super避免无限递归 super().__getattribute__("standardFunction")() # 返回自身支持后续链式操作 return self # 实例被当作函数调用时触发该方法 def __call__(self, *args, **kwargs): super().__getattribute__("standardFunction")() return self
效果验证
你提到的所有调用场景都可以正常触发输出:
ex1 = Example() ex1.test1() # 输出Hello ex1.test2 # 输出Hello ex1.test3.test4() # 访问test3输出1次,调用test4输出1次,共2次Hello ex1.test5().test6().IamBatman(42) # 每一步访问/调用各输出1次,共6次Hello
原理解释
__getattribute__是Python内置的属性访问拦截方法,所有对实例属性的访问操作(无论属性是否存在)都会优先触发该方法,我们在这里嵌入standardFunction的执行逻辑,再返回实例本身,就可以覆盖所有属性访问场景,同时支持后续链式操作。__call__是Python内置的可调用实例魔术方法,让实例可以像函数一样被调用,调用时同样执行standardFunction再返回自身,覆盖所有带括号的方法调用场景。
如果需要保留类原有属性(比如parameter1)的正常取值逻辑,只需要在__getattribute__中加白名单判断即可,不会影响核心功能。
内容的提问来源于stack exchange,提问作者Bart M
相关产品推荐
相关产品推荐

