You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 01:57:26