我有这门课:
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()
实例变量
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()
类定义
seems
工作(在没有syntax
错误的意义上),但是当我运行它时,出现错误:
TypeError: Point.check1() missing 1 required positional argument: 'self'
只需在类主体中执行,然后在
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()
注意,这在继承的情况下表现不同。但这可能没问题,具体取决于您的用例。你
可以做像checks = ['check1', 'check2']
这样的事情,然后在
run_all_checks
,像
getattr(self, check)()
,但是IMO,这更脆弱。因此,如果我打算在子类中覆盖这些方法,那么在这种情况下我会采用您原来的方法。