【问题标题】:Python: how to automatically create an instance in another classPython:如何在另一个类中自动创建实例
【发布时间】:2013-11-27 01:18:05
【问题描述】:

在编写 Python (2.5) 程序时,我尝试创建一个类,并在其 __init__ 函数中自动创建另一个类的实例,并将其名称作为 __init__ 函数的参数,如下所示:

    class Class1:
        def __init__(self,attribute):
            self.attribute1=attribute

    class Class2:
        def __init__(self,instanceName):
            #any of Class2's attributes
            exec instanceName + '=Class1('attribute1')'
            # this should produce an instance of Class1 whose name is instanceName

但是当我创建 Class2 的实例 instance=Class2('instance2') 并尝试获取 instance2 的属性 1(它应该是从 Class2 的 __init__ 函数创建的)时,我收到一条错误消息:

    Traceback (most recent call last):
      File "<pyshell#29>", line 1, in <module>
        print instance2.attribute1
    NameError: name 'instance2' is not defined

我不知道问题是什么,因为name='instance3'exec name+'=Class1('attribute1') 确实有效,但这可能是因为我对 Python 没有太多经验。创建实例时如何自动执行此类操作?

【问题讨论】:

  • 在 Python 2 中,你的类不应该扩展object吗?
  • 你到底想做什么?我很确定有一种不涉及这种结构的方法可以做你想做的事。
  • 似乎是一个 XY 问题 - 为什么需要将实例分配给特定名称?现在你正试图将它创建为一个局部变量,这没有什么意义,因为它只能在局部范围内访问。你的用例是什么?
  • 当我添加 exec 'global '+instancename 时,这仍然不起作用,这应该使它可以作为全局变量访问。
  • 我这样做的目的是能够从 Class2 之一创建 Class1 的实例,同时还能够在不使用 Class2 的情况下创建实例,这是我知道的唯一方法.

标签: python class python-2.5


【解决方案1】:

我必须跑,所以希望其他人可以纠正这篇文章中的任何错误:

class Class1:
  def __init__(self, attribute):
    self.attribute1 = attribute

class Class2:
  def __init__(self, instanceName):
    setattr(self, instanceName, Class1(...))  # replace ... with whatever parameters you want

【讨论】:

  • 这,setattr(self,instanceName,class1('attribute text')) 似乎确实有效,使 instanceName 成为 class1 的全局实例。
  • 虽然这在我给出的示例中有效,但当我将其合并到我最初正在处理的更复杂的程序中时,我收到了相同的错误消息 NameError: name 'instance2' is not defined
猜你喜欢
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
  • 2023-02-11
  • 2021-04-02
  • 2018-11-02
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多