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)
只需在类主体中执行此操作,然后在 中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)(),但在我看来,这更脆弱。因此,如果我打算在子类中重写这些方法,那么在这种情况下我会采用您原来的方法。