【问题标题】:Python 2.7: How to extend a class from an imported base classPython 2.7:如何从导入的基类扩展类
【发布时间】:2013-05-31 17:46:36
【问题描述】:

python 新手,如果这是小问题,我们深表歉意:

编写一个小模块(最终可能是一个包?)。它对于单个文件来说太大了,所以我将较大的类移动到单个文件中。我所有的类都扩展了我用来容纳一些基本功能的基类。

这是我的问题的一般形式:

runtime.py:

import baseclass
import subclass

#do stuff

baseclass.py

class BaseClass():
    def __init__(self):
        pass

    def sharedMethod(self):
        pass
        # shared functionality

subclass.py

class SubClass(baseclass.BaseClass):
    def __init__(self):
        BaseClass.__init__(self)

回溯显示:

Traceback (most recent call last):
  File "/path/to/runtime.py", line 2, in <module>
    import baseclass, subclass
  File "path/to/subclass.py", line 2, in <module>
    class Subclass(baseclass.BassClass):
  NameError: name 'baseclass' is not defined

如果我将 baseclass 导入到 subclass.py 中,它可以正常工作,但这似乎意味着每个扩展 baseclass 的类都需要导入它,不能是这种情况这样做的适当方法是一遍又一遍地导入baseclass

我希望能够按照它们相互构建的顺序从单独的文件中导入类,我只是不知道该怎么做。建议?


注意:所有答案都有帮助/正确。对于“正确”的答案,我只是选择了最彻底/最有可能对每个人有用的答案。干杯,谢谢。 :)

【问题讨论】:

  • 但这就是它的工作原理。如果之前没有导入 SubClass 应该如何知道它的 BaseClass?
  • 克服此错误后,我认为您需要将“超级”调用更改为baseclass.BaseClass.__init__(self)

标签: python oop inheritance python-2.7


【解决方案1】:

你说的完全正确。您必须在要使用它的任何文件中导入基类。如果您有很多文件使用它,那么正确的方法确实是“一遍又一遍地”导入它。

但这并不意味着每个扩展基类的 都需要导入它。这只是意味着每个使用基类的 module 都需要导入它。给定文件中不需要只有一个类,也没有特别的理由这样做。将import baseclass 放在一个文件中,然后在该文件中定义几个都继承自基类的新类,这非常好。这是做事的好方法。不要将每个类拆分到自己的文件中,除非每个类确实足够大且足够复杂以保证这样做。

此外,在许多文件中执行import baseclass 不会消耗任何资源。实际的baseclass.py 文件只运行一次,并且在以后的导入中会重复使用相同的模块,因此您无需为多次导入而在性能方面付出任何额外的代价。

import 是 Python 文件从其他 Python 模块访问内容的方式。如果不导入它们,您就不能在另一个文件中使用一个文件中的东西。

顺便说一句,您为什么要将 __name__ = "SubClass" 业务放入您的模块中?

【讨论】:

  • 谢谢一百万,这回答了我的问题;我没有意识到继续导入没有开销。我的一些模块确实有很多类,但有一些类是 1k+ 行,而且……我不喜欢滚动? ;) 我认为 name 参数只是很好的形式,即。正确注释代码的一部分。不是这样吗?
  • @Jonline。回复__name__:没有。你从哪里得到这些信息的? __name__ 将由 Python 在内部设置为您的模块的名称(例如,对于 baseclass.py,它将是 "baseclass" 等等)。同样,将在每个类上设置__name__(BaseClass 类将__name__ 设置为"BaseClass")。你不应该明确设置__name__,除非你正在做一些时髦的事情(例如,用另一个类包装一个类并试图使它与被包装的类“看起来一样”)。
  • 啊,我明白了。因此,一位程序员朋友 IRL 通知我,我怀疑这个错误与我对建议的理解有关,哈哈。再次感谢。
  • @Jonline:没问题,享受 Python!
【解决方案2】:

在 Python 中,模块的行为类似于单独的程序。所以,如果你在 runtime.py 中导入 baseclass,它不会被导入到 subclass.py 中。 subclass.py 必须自己导入基类。

【讨论】:

    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 2015-10-22
    • 2010-09-07
    • 2012-01-09
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 2015-09-03
    相关资源
    最近更新 更多