避免在Python子类中使用if __name__ == '__main__'以便通过父类函数运行

5 投票
2 回答
2724 浏览
提问于 2025-04-17 02:05

我有一个通用的类(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__),这样就可以实现你想要的功能。

撰写回答