避免 if __name__ == '__main__'在Python子类中使用父类的函数运行

发布于 2024-12-04 04:01:34 字数 441 浏览 2 评论 0原文

我有一个通用类(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)?

I have a generic class (A) which is to be subclassed a lot like this:

class A:
    def run(self):
        ...
        self.do_something()
        ...

    #abstract function
    def do_something(self):
        pass


class B(A):
    def do_something(self):
        ...

The subclasses are in separate files that I'm running directly by adding this code to each file (B is the name of the subclass in the file):

if __name__ == '__main__':
    B().run()

My question is, can I avoid having to add this code to all files with the subclasses since the only thing that changes in the code is the class being used (B in the example)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

画离情绘悲伤 2024-12-11 04:01:34

如果你的Python版本足够新,你可以创建一个类装饰器。

在这种情况下,是一种间接的。

def runifmain(mainname):
    def deco(clas):
        if mainname == '__main__':
            clas().run()
        return clas
    return deco


@runifmain(__name__)
class B(A):
    [...]

如果您在某个地方集中定义 runifmain() 并在需要的地方使用 @runifmain(__name__) ,那么应该可以完成这项工作。

If your python version is recent enough, you can create a class decorator.

In this case, an indirect one.

def runifmain(mainname):
    def deco(clas):
        if mainname == '__main__':
            clas().run()
        return clas
    return deco


@runifmain(__name__)
class B(A):
    [...]

should do the job if you define runifmain() somewhere centrally and just use the @runifmain(__name__)wherever it is needed.

谁把谁当真 2024-12-11 04:01:34

向你的主类 A 添加一个额外的函数怎么样?

class A():
    ..
    def __RunIfMain__(self,name):
        if name == '__main__':
            self.run()

在你的子类中你会少一行:

class B(A):
  ..

B().__RunIfMain__(__name__)

What about adding an extra function to your main class A?

class A():
    ..
    def __RunIfMain__(self,name):
        if name == '__main__':
            self.run()

In your subclass you'd have one line less:

class B(A):
  ..

B().__RunIfMain__(__name__)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文