Python如何将类实例方法作为同类另一实例方法的默认参数
问题原因
Python的函数默认参数会在函数定义阶段完成求值,不会延迟到函数调用阶段。类定义时还不存在实例对象,self尚未初始化,因此无法直接将self.say_hi设为默认参数;直接写say_hi拿到的是未绑定实例的类函数,调用时不会自动注入self参数,执行时会报错。
正确实现
使用None作为默认参数占位符,在方法执行阶段再绑定实例方法即可:
from typing import Callable, Optional class Person: def __init__(self, name): self.name = name def say_hi(self): print("Hello, my name is", self.name) def greet(self, func: Optional[Callable] = None): # 方法执行时self已完成初始化,此时绑定实例方法 if func is None: func = self.say_hi func() p = Person("Guido") # 不传参时使用默认的say_hi方法 p.greet() # 也支持传入自定义可调用对象 def custom_greet(): print("这是自定义的打招呼逻辑") p.greet(custom_greet)
运行输出:
Hello, my name is Guido 这是自定义的打招呼逻辑
内容的提问来源于stack exchange,提问作者Joost Döbken
相关产品推荐
相关产品推荐

