【问题标题】:Is it possible to use the same object in multiple files?是否可以在多个文件中使用相同的对象?
【发布时间】:2020-07-31 10:15:48
【问题描述】:

我是 Python 编码新手,我正在尝试使用对象创建游戏。在 main.py 中,我使用名为 Room 的类创建了代表特定房间的对象。我可以在单独的文件中实例化这些对象,然后在 main.py 中使用它们吗?如果可以,我该怎么做?

我尝试简单地在文件中创建一个对象并在 main.py 中使用它,但它不起作用。我还尝试在第二个文件中创建一个创建房间对象的方法,然后在 main.py 中调用它,但这也不起作用。我也找不到任何有关在多个文件中使用对象的文档。

这是一个房间对象的例子:

dining_hall = Room("Dining Hall")
dining_hall.set_description("A large room with ornate golden decorations on each wall")

这是房间类的构造函数:

def __init__(self, room_name):
    self.name = room_name
    self.description = None

【问题讨论】:

    标签: python object global-variables instantiation


    【解决方案1】:

    是的,您可以在单独的文件中实例化对象。此外,您使用的两种方式都符合描述。不幸的是,我没有看到您编写的完整代码,因此无法准确判断出了什么问题。以下是您如何实现目标的两个示例:

    使用另一个文件中的对象:

    dining_hall.py

    dining_hall = Room("Dining Hall")
    

    ma​​in.py

    from dining_hall import dining_hall
    
    dining_hall.set_description("A large room with ornate golden decorations on each wall")
    

    或者你可以使用特殊的实例化函数(更好地实现类似单例的东西):

    dining_hall.py

    dining_hall_object = None
    
    def get_dining_hall():
        global dining_hall_object
    
        if dining_hall_object is None:
            dining_hall_object = Room("Dining Hall")
    
        return dining_hall_object
    

    ma​​in.py

    from dining_hall import get_dining_hall
    
    dining_hall = get_dining_hall()
    dining_hall.set_description("A large room with ornate golden decorations on each wall")
    

    【讨论】:

    • 您的第一个解决方案奏效了。我不知道您可以从文件中导入对象。感谢您的帮助!
    • 对于第二种解决方案,它给了我以下错误:UnboundLocalError: local variable 'dining_hall_object' referenced before assignment
    • 我错过了声明全局变量,我的错。改变了我对工作的回应
    【解决方案2】:

    通常,您需要在“单独”文件中定义/实现您的类,然后在主脚本中初始化对象实例,该脚本可能称为主脚本,也可能不称为主脚本。

    房间.py

    class Room:
    
      def __init__(self, room_name):
        ...
    

    main.py (确保包含 room.py 的文件夹在您的路径中)

    from room import Room
    
    dining_hall = Room("Dining Hall")
    ...
    

    也许您可以解释为什么要在另一个脚本中初始化 - 例如,您可能希望“Dining Hall”已经知道它的描述,或者您可能希望强制“Dining Hall”是唯一的?有针对这类问题的设计模式,但我需要了解更多您想要实现的目标。

    【讨论】:

    • 我希望“Dining Hall”已经知道它的描述,以便它在我的主文件中占用更少的空间。我已经在 Room 类中定义了我的对象,我想在不同的文件中创建 Room 类的实例,然后在主文件中使用该实例。
    猜你喜欢
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    相关资源
    最近更新 更多