【问题标题】:How to inherit class from different file?如何从不同的文件继承类?
【发布时间】:2017-03-07 08:21:53
【问题描述】:

我有两个文件:

fig.py

import math
PI=math.pi

class Fig:
    def __init__(self):   
        self.name= " "

还有

circle.py

class Circle(Fig):
    def __init__(self, radius):
        self.name= "Circle"
        self.data= ["Radius: ", radius]

但我正在尝试加载它们,我每次尝试时 jupyter-notebook 都会抛出错误:

NameError: name 'Fig' 没有定义

我曾尝试在 circle.py 的开头使用import fig,但它不起作用,同时运行这两个文件也不起作用。它们都在同一个目录中。

【问题讨论】:

    标签: python inheritance jupyter-notebook


    【解决方案1】:

    好的,目前还不清楚出了什么问题,因为您没有准确地向我们发送您在做什么,但这是我的猜测。如果你的circle.py文件如下

    import fig
    class Circle(Fig):
        def __init__(self, radius):
            self.name= "Circle"
            self.data= ["Radius: ", radius]
    

    这会中断,因为 python 不知道在哪里可以找到 Fig。如果你写

    import fig
    class Circle(fig.Fig):
        def __init__(self, radius):
            self.name= "Circle"
            self.data= ["Radius: ", radius]
    

    from fig import Fig
    class Circle(Fig):
        def __init__(self, radius):
            self.name= "Circle"
            self.data= ["Radius: ", radius]
    

    一切都应该正常。这是因为您要么必须告诉 python 可以访问类的名称空间(我的第一个解决方案),要么显式导入类(我的第二个解决方案)。如果你想使用PI,同样的逻辑也适用:

    import fig
    class Circle(fig.Fig):
        def __init__(self, radius):
            self.name= "Circle"
            self.data= ["Radius: ", radius]
            #use PI from fig.py by informing python of namespace
            self.circumference = 2.*fig.PI*radius 
    

    from fig import Fig, PI
    class Circle(fig):
        def __init__(self, radius):
            self.name= "Circle"
            self.data= ["Radius: ", radius]
            #PI is now explicitly imported so don't need namespace
            self.circumference = 2.*PI*radius
    

    【讨论】:

    • 两个选项继承都有效,但前两行无效。如果我 run circle 未定义 PI。如果我同时运行,我会得到 SyntaxError: invalid syntax.
    【解决方案2】:

    您需要在 circle.py 中执行 from fig import FIG。还要确保在具有 circle.pyfig.py 的文件夹中存在 __init__.py 文件。

    还请看:

    【讨论】:

      【解决方案3】:

      您需要在circle.py 中从fig.py 导入类Fig

      如果只是导入模块fig,则必须通过相应的命名空间访问类Fig

      class Circle(fig.Fig):
          <snip>
      

      如果要直接使用类名,请使用from fig import Fig 导入。

      【讨论】:

        【解决方案4】:
        from packagename.fig import Fig
        
        class Circle(Fig):
            def __init__(self, radius):
                self.name = "Circle"
                self.data = ["Radius: ", radius]
        

        packagename 是您的实际包名。

        【讨论】:

          猜你喜欢
          • 2010-09-20
          • 1970-01-01
          • 1970-01-01
          • 2013-06-28
          • 1970-01-01
          • 2018-03-10
          • 1970-01-01
          • 2021-09-30
          • 2021-05-28
          相关资源
          最近更新 更多