如何将实例方法列表分配给类变量?

Phi*_*ppe 1 python variables class instance

我有这个有效的课程:

class Point:
    def __init__(self):
        self.checks = [self.check1, self.check2]

    def check1(self):
        return True

    def check2(self):
        return True

    def run_all_checks(self):
        for check in self.checks:
            check()
Run Code Online (Sandbox Code Playgroud)

实例变量checks并不特定于实例,因此我想将其移至类级别,这是我的尝试:

class Point:

    def __new__(cls, *args, **kwargs):
        cls.checks = [cls.check1, cls.check2]
        return super(Point, cls).__new__(cls, *args, **kwargs)

    def check1(self):
        return True

    def check2(self):
        return True

    def run_all_checks(self):
        for check in self.checks:
            check()
Run Code Online (Sandbox Code Playgroud)

类定义seems可以工作(在没有syntax错误的意义上),但是当我运行它时,出现错误:

TypeError: Point.check1() missing 1 required positional argument: 'self'
Run Code Online (Sandbox Code Playgroud)

更新

通过@juanpa.arrivilillaga的解决方案,我的问题得到了解决:

class ParentFuncs:
    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)


class ChildFuncs(ParentFuncs):
    def check3(self):
        print("check3")

    def check4(self):
        print("check4")

    checks = ParentFuncs.checks + [check3, check4]

ChildFuncs().run_all_checks()
# Output
check1
check2
check3
check4
Run Code Online (Sandbox Code Playgroud)

jua*_*aga 5

只需在类主体中执行此操作,然后在 中run_all_checks,确保显式传递实例,因为它们只是函数,而不是绑定方法(通过和实例访问方法时创建的绑定方法):

class Point:

    def check1(self):
        return True

    def check2(self):
        return False

    checks = [check1, check2]

    def run_all_checks(self):
        for check in self.checks:
            print(check(self))


point = Point()
point.run_all_checks()
Run Code Online (Sandbox Code Playgroud)

请注意,在继承的情况下,其行为方式不同。但这可能没问题,具体取决于您的用例。

可以做类似的事情checks = ['check1', 'check2'],然后在run_all_checks,类似的事情getattr(self, check)(),但在我看来,这更脆弱。因此,如果我打算在子类中重写这些方法,那么在这种情况下我会采用您原来的方法。