【问题标题】:How to import classes in subfolders如何在子文件夹中导入类
【发布时间】:2018-06-06 13:43:21
【问题描述】:

在 Python 3.6 上

我想在文件夹中组织我的课程。

文件夹Classes中的ClassX

子文件夹中的Subclass_of_ClassX

MyPackage
    -__init__.py
    -someCode.py
    -folder Classes
        -__init__.py
        -ClassX.py
        -Subfolder SubClasses
            -__init__.py
            -Subclass_of_ClassX.py

Subclass_of_ClassX 覆盖 ClassX 中的元素(函数和变量)

问题是:如果我在任何项目中导入 ClassX,并且我获得了 Subclass_of_ClassX 的任何实例,并且我想使用任何被覆盖的函数,我是否需要显式导入子类?

或者我可以从任何继承的类中导入 ClassX 并抽象,使用任何子类实例,就好像它是 ClassX 一样?

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    如果您从某处获得Subclass_of_ClassX 的实例,则根本不需要额外导入该类。导入一个类只会使该名称在您当前的范围(模块)中可用。

    您只需要在需要时导入类或子类...

    • 创建一个新实例
    • 写一个子类
    • 以其他方式使用它,如isinstance(obj, ClassX)

    【讨论】:

      【解决方案2】:

      如果你有类的实例 - 你已经不需要导入任何东西,因为它已经在其他地方导入了。

      【讨论】:

      • 通过“类的实例”,您还指任何子类实例?
      • 是的,我说的是子类——实例已经链接到它们的类,所以如果没有在某处导入类就不能创建实例。您甚至可以通过instance.__class__ 获得子类本身,而无需导入它
      【解决方案3】:

      您所描述的不是 Python 式的构建包的方式。

      你最终不得不做

      from mypackage.Classes.ClassX import ClassX
      

      什么时候可以做

      from mypackage.class_x import ClassX
      

      如果你的包裹是,呃,举个例子,一个动物园,里面有动物和食物,我建议把动物放在一个包裹里,把它们的食物放在另一个包裹里。

      • myzoo/__init__.py(空)
      • myzoo/animals/__init__.py(空)
      • myzoo/animals/base.py(包含您的 Animal 基类)
      • myzoo/animals/cats.py(例如包含LionTiger
      • myzoo/foods/__init__.py(空)
      • myzoo/foods/base.py(包含您的 Food 基类)
      • myzoo/foods/kibbles.py(包含猫的粗磨食物,不是它们会喜欢它们)

      (您也可以为每种动物/食物创建一个文件,如果您预计它们会变大,可能应该这样做。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-30
        • 1970-01-01
        • 1970-01-01
        • 2019-11-24
        • 2013-12-24
        相关资源
        最近更新 更多