【问题标题】:How do you get a method whose code instantiates another object to initialize a different object each time its called? [duplicate]您如何获得一个方法,其代码实例化另一个对象以在每次调用时初始化一个不同的对象? [复制]
【发布时间】:2012-05-09 00:27:11
【问题描述】:

对不起,如果标题中的问题不是很清楚,但我的空间有限, 澄清一下……

在我的代码中,我有一个名为 empDB 的类,它创建一个用于存储对象的空列表。

我也将新对象添加到列表中,我在 empDB 中创建了一个名为 appendEmp 的方法。 appendEmp 接受一个参数,该参数指定它将实例化的类,然后将其添加到列表中。如果未提供参数,则默认为 Employee() 类。

这是我的问题

当我调用 appendEmp 方法时,它会在列表中创建新对象,但是当我尝试实例化已经在列表中的对象时,它只会创建它的别名。我每次都需要它来创建一个新对象,以便我可以单独编辑列表中每个对象的属性。

这是我的代码的 sn-p:

class empDB:

    def __init__(self, lst= []):                  #creates empty list
        self.lst = lst

    def appendEmp(self, emp=Employee()):
        self.lst=self.lst+[emp]

基本上这就是现在发生的事情

>>> db=empDB()
>>> db.appendEmp()
>>> db.appendEmp()
>>> db[0] is db[1]
True

我需要它是假的

【问题讨论】:

    标签: python class object methods


    【解决方案1】:

    你可以这样解决你的问题:

    class empDB:
        def __init__(self, lst= []):  #creates empty list
            self.lst = lst
        def appendEmp(self, emp=None):
            if emp is None:
                empt = Employee()
            self.lst=self.lst+[emp]
    

    这个问题是由可变值被分配为默认参数引起的。我用None 替换了它,不过如果你想接受这个值作为appendEmp() 的参数,你可以用别的东西替换它。

    有关使用可变默认参数的危险的更多信息,您可以在此处阅读:Hidden features of Python: Dangers of mutable default arguments

    附言。您可能还希望对 __init__() 方法执行相同的操作。

    【讨论】:

    • 你可能想解释一下原因。
    • @Lattyware:我听从了您的建议并解释了 + 添加了更多详细信息的链接。
    • 太棒了!感谢您的快速回复
    【解决方案2】:

    如果您不完全了解它们的工作原理,可变的默认参数可能会导致麻烦。大多数初学者没有意识到,在处理定义时,关键字参数的默认值只计算一次。如果函数代码此后修改了这个对象,那么下一次使用默认对象的调用将看到修改后的值。

    我用http://holdenweb.com/files/IntroNotes.pdf#page=118开头的图片来解释这个

    顺便说一下,这些笔记是我的“Python 简介”课程的开源版本草稿,因此我将不胜感激。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      相关资源
      最近更新 更多