首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导入错误:没有名为“BluePrints”的模块

导入错误:没有名为“BluePrints”的模块
EN

Stack Overflow用户
提问于 2015-07-23 02:58:42
回答 1查看 1.1K关注 0票数 1

我正在为一个暑期班学习Python,并且遇到了这个错误:在下面的代码中,您将看到我有一个包,我将它加载到Director.py中,我正在使用它作为我的主文件。但是,当BluePrints.py明显位于目录中时,它就会丢失。我也检查了多次打字错误,但这不是问题。在我正在学习的书中,没有关于这个问题的文档,也没有我可以在中看到的文档,也无法在StackOverflow上找到这个特定的问题。这是我的代码:

代码语言:javascript
复制
# Director.py
from Builder import HouseBuilders as hb, HouseBuilderInterface as hbi 

interface = hbi.HouseBuilderInterface()   # An interface to my concrete builders
first_house = hb.EarthHomeBuilder()   # Initialize a concrete builder

interface.build_room(first_house, 'kitchen')  # Build a room in the Earth House

Builder/Builder BuilderInterface.py

代码语言:javascript
复制
class HouseBuilderInterface():

    """ HouseBuilder utilizes Python's duck-typing to provide an interface to the concrete house builders"""
    def build_room(obj, room_type):     # Rooms are an attribute shared by all houses
        obj.build_room(room_type)
    
    def build_wall(obj, room1, room2):  # Walls are an attribute shared by all houses; Duplex's will have a unique Dividing Wall
        obj.build_wall(room1, room2)
        
    def build_window(obj, wall):        # Windows are an attribute shared by all houses
        obj.build_window(wall)
        
    def build_door(obj):                # Doors are an attribute shared by all houses; Colonial and Split-level houses can have basement doors
        obj.build_door()
        
    def build_stairs(obj):              # Stairs can only be built in Colonial and Split-level houses; Colonial stair cases are bigger
        obj.build_stairs()
        
    def build_extra(obj):               # Some houses have extra features: Earth-homes have plants on the roof, Single-story has a wrap-around-porch, etc.
        obj.build_extra()

建筑商/房屋建筑商

代码语言:javascript
复制
import BluePrints

class EarthHomeBuilder():

    def __init__(self):     # Initialize a simple house
        self.room_no = 0
        self.window_no = 0
        self.door_no = 1
        self.wall_no = 4
        self.key = 0                # key attribute is a unique key for the dictionary
        self.house_features = {}
        
    def build_room(self, room_type):
        new_room = BluePrints.Room(room_type)
        self.room_no += 1
        self.house_features[key] = room_type + ''
        self.key += 1

Builder/BluePrints.py

代码语言:javascript
复制
class Room():
    """ Defines a room object with an attribute of room_type"""
    def __init__(self, room_type):
        self.room_type = room_type
        
class Wall():
    """ Defines a Wall object with attributes of window and door """
    def __init__(self):     # Initialize windows & doors to 0 
        self.windows = 0
        self.doors = 0
        
    def add_window(self):
        self.windows += 1
        
    def add_door(self):
        self.doors += 1
        
class Window():
    """ Defines a Window object with no attributes; Adds a window to specified Wall object"""
    def __init__(wall_location):
        wall_location.add_window()      # Use duck-typing to call Wall method add_window()
        
class Door():
    """ Defines a Door object with no attributes; Adds a door to specified Wall object """
    def __init__(wall_location):
        wall_location.add_door()        # Use duck-typing to call Wall method add_door()
        
class StairCase():
    """ Defines a StairCase object with an attribute of length """
    def __init__(self, length):
        self.length = length
        
class ExtraFeature():
    """ Defines an ExtraFeature object which is unique type of house feature specific to each house """
    def __init__(self, extra_feature):
        self.extra_feature = extra_feature

注意:此作业是Builder软件模式的实现。此外,我只测试了build_room方法,如Director.py文件中所示。我不关心任何错误,除非它们涉及导入BluePrints.py的问题,确切的错误消息是ImportError:没有名为'BluePrints‘的模块

编辑:

我正在使用Python3.4

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-23 03:57:23

问题是,在将HouseBuilders导入Director.py之后,sys.path仍然保留在Director.py的目录中,因此在sys.path指定的任何目录中都没有BluePrints.py

在试图找到要导入的包或类时,python查找的正是sys.path。另外,我猜您正在使用Python3.x。

解决办法是按文档说的去做-

6.4.2.包内引用 当包被构造成子包时(如示例中的声音包),您可以使用绝对导入来引用兄弟程序包的子模块。例如,如果模块sound.filters.vocoder需要使用sound.effects包中的回显模块,则可以从sound.effects导入回送。

因此,在Builder/HouseBuilders.py中,将导入语句更改为-

代码语言:javascript
复制
from Builder import BluePrints
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31577446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档