Python中如何在类变量中引用对象方法
问题:如何将实例方法的引用集合设为类属性?
原代码中,checks是实例属性,每个实例都会创建一份:
class A: def __init__(self): self.checks = (self.check1, self.check2) def check1(self): print("check1") def check2(self): print("check2") def run_all_checks(self): for check in self.checks: check() a = A() a.run_all_checks()
尝试将checks改为类属性时,直接使用self会报错:
class A: checks = (self.check1, self.check2) def check1(self): print("check1") def check2(self): print("check2") def run_all_checks(self): for check in self.checks: check() a = A() a.run_all_checks()
报错信息:
NameError: name 'self' is not defined
以下是几种可行的实现方式:
方案1:存储方法名称字符串,运行时获取绑定方法
类属性存储方法名,在执行时通过getattr从实例获取绑定好的方法:
class A: checks = ("check1", "check2") def check1(self): print("check1") def check2(self): print("check2") def run_all_checks(self): for check_name in self.checks: getattr(self, check_name)() a = A() a.run_all_checks()
这种方式无需担心方法定义顺序,且类属性占用内存小,适合大多数场景。
方案2:存储类的未绑定方法,调用时传入实例
将checks定义在所有方法之后,直接引用类的未绑定方法,调用时手动传入self:
class A: def check1(self): print("check1") def check2(self): print("check2") checks = (check1, check2) def run_all_checks(self): for check in self.checks: check(self) a = A() a.run_all_checks()
注意:必须保证checks在方法定义之后,否则会因方法未定义报错。
方案3:装饰器自动收集检查方法
如果需要频繁新增检查方法,用装饰器自动标记并收集,避免手动维护checks列表:
class A: checks = [] @classmethod def register_check(cls, func): cls.checks.append(func) return func @register_check def check1(self): print("check1") @register_check def check2(self): print("check2") def run_all_checks(self): for check in self.checks: check(self) a = A() a.run_all_checks()
后续新增检查方法时,只需给方法加上@register_check装饰器即可自动加入checks集合。
内容的提问来源于stack exchange,提问作者Philippe
相关产品推荐
相关产品推荐

