簡體   English   中英

與Python的導入內部包引用混淆

[英]Confused with Python's import intrapackage references

我運行Python 2.7.6。 我在創建程序包時遇到問題。 以下是MWE:

我有以下文件:

run.py
    MyPackage/
        __init__.py
        Father_class.py
        Son_class.py
        class1.py

具有以下內容:

初始化 .py

__all__ = ['Father_class', 'Son_class', 'class1']

運行

from MyPackage import Father_class, Son_class

Father_class.py:

class Daddy(Object):
    def __init__(self):
        self.hello=1

Son_class.py:

from MyPackage import *
# alternatively I tried: from MyPackage import class1, Father_class
class Sonny(Daddy):
    def __init__(self):
        super(Daddy, self).__init__()
        self.bye=class1.MyClass1()
        #alternatively I tried self.bye=MyClass1()

class1.py:

class MyClass1(Object):
    def __init__(self):
        self.life=1

運行run.py時,我得到:

    self.bye=class1.MyClass1()
NameError: global name 'class1' is not defined

關於我在做什么錯的任何想法?

Oleg S.的答案可能是最好的方法,因為它避免了混亂的import *

僅供參考, Son_class.py from MyPackage import *Son_class.py可能無法按您預期的那樣工作,是因為您只能從__init__.py中定義的MyPackage對象中進行導入

如果您將__init__.py更改為

import Father_class
import Son_class
import class1

您的示例應該可以正常工作。

順便說一句, 約定指出 python模塊名稱是小寫的。

除非導入的內容在全局site-packages或在virtualenv中可用,否則您只能相對於導入來源導入模塊。 因此模塊aPackage/a無法導入模塊bpackage/b通過導入package並從那里進行導航,但是它可以導入b直接(在相同的電平是):

對於Son_class.py,請使用:

from class1 import MyClass1
from Father_class import Daddy

class Sonny(Daddy):
    def __init__(self):
        super(Daddy, self).__init__()
        self.bye=MyClass1()

否則,建議在導入過程中具體輸入,並准確導入所需的定義:一旦需要重構任何內容,這將有很大的幫助。 如果要明確記下導入路徑,則還會收到一條更明智的錯誤消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM