避免在Python子类中使用if __name__ == '__main__'以便通过父类函数运行
我有一个通用的类(A),这个类会被很多其他类继承,像这样:
class A:
def run(self):
...
self.do_something()
...
#abstract function
def do_something(self):
pass
class B(A):
def do_something(self):
...
这些子类都在不同的文件里,我通过在每个文件里添加这段代码来直接运行它们(B是文件中子类的名字):
if __name__ == '__main__':
B().run()
我想问的是,能不能不在所有子类的文件里都添加这段代码呢?因为代码里唯一变化的就是使用的类名(在这个例子中是B)。
2 个回答
2
你觉得在你的主类A里加一个额外的功能怎么样?
class A():
..
def __RunIfMain__(self,name):
if name == '__main__':
self.run()
在你的子类里,这样就少了一行代码:
class B(A):
..
B().__RunIfMain__(__name__)
8
如果你的Python版本比较新,你可以创建一个类装饰器。
在这种情况下,是一种间接的装饰器。
def runifmain(mainname):
def deco(clas):
if mainname == '__main__':
clas().run()
return clas
return deco
@runifmain(__name__)
class B(A):
[...]
如果你在某个地方定义了runifmain()
,然后在需要的地方使用@runifmain(__name__)
,这样就可以实现你想要的功能。