【问题标题】:How does Python handle imported subclasses?Python 如何处理导入的子类?
【发布时间】:2014-01-17 14:48:37
【问题描述】:

我正在从事一个项目,该项目需要我在一个文件中构建多个类和子类,并在第二个文件中使用它们。我想问一下Python如何处理将第一个文件导入第二个文件。

例如,如果我有一个文件 my_classes.py:

class Myclass(object):
    pass

class Mysubclass(myclass):
    pass

将使用以下代码工作:

from my_classes import Myclass

print Mysubclass

(其中print 命令只是使用Mysubclass 的一个示例),还是我需要显式导入Mysubclass

提前致谢!

【问题讨论】:

  • 何不试试这段代码,看看有没有错误?
  • 似乎是显而易见的解决方案,确实回答了我的问题。但是,我想了解一些有关 Python 行为方式的背景信息(例如,为什么在导入类时不会自动加载子类)。

标签: python class import subclass


【解决方案1】:

这行不通。 Python import 语句不关心子类。其实,它什么都不在乎。它完全按照你告诉它去做。 “显式胜于隐式”是 Python 圈子里的一句流行语。

这里:

from my_classes import Myclass

您告诉 Python 只导入 Myclass

这将导入两个类:

from my_classes import Myclass, Mysubclass

您可以阅读 Python import 的工作原理here

【讨论】:

  • 谢谢!您提供的链接有点超出我的理解,但回答了我的问题。
【解决方案2】:

如果您这样做,您的子类将不可用。您必须单独导入每个对象。

这里是一个简单的例子

test_class.py 我的类(对象): def 初始化(自我): 打印自己。班级

class MySubClass(MyClass):
    def __init__(self):
        print self.__class__

test_class_import.py 从 test_class 导入 MyClass

MyClass()
MySubClass()

##output##
<class 'test_class.MyClass'>
Traceback (most recent call last):
  File "test_class2.py", line 4, in <module>
    MySubClass()
NameError: name 'MySubClass' is not defined

但是

from test_class import MyClass, MySubClass
MyClass()
MySubClass()

##output##
<class 'test_class.MyClass'>
<class 'test_class.MySubClass'>

【讨论】:

    【解决方案3】:

    每个模块都有一个命名空间。

    命名空间是从变量名到值(Python 对象)的映射。

    声明

    import my_classes
    

    通过将变量名称my_classes 放在当前模块的命名空间中,使my_classes 命名空间可从当前模块访问。然后,您可以使用语法访问来自 my_classes 的值

    my_classes.variable
    

    所以,例如:

    import my_classes
    print my_classes.Mysubclass
    print my_classes.MyClass
    

    如果打字太多,我建议

    import my_classes as MC
    print MC.Mysubclass
    print MC.MyClass
    

    你也可以

    from my_classes import Mysubclass, MyClass
    

    但是这种导入形式是discouraged by some Python experts

    from my_classes import Mysubclass, MyClass
    

    加载整个模块 my_class 但仅 将变量名称 MysubclassMyClass 放在当前模块的命名空间中。它们指向与my_classes 命名空间中的同名变量相同的值。您无法从 my_class 模块的命名空间访问任何其他内容。

    【讨论】:

      猜你喜欢
      • 2020-03-09
      • 2017-03-04
      • 1970-01-01
      • 2011-01-27
      • 2011-01-05
      • 1970-01-01
      • 2016-04-15
      • 2015-01-09
      • 2016-04-06
      相关资源
      最近更新 更多