你如何获得一个方法,其代码实例化另一个对象以在每次调用时初始化不同的对象



抱歉,如果标题中的问题不是那么清楚,但我的空间有限,澄清...

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

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

这是我的问题

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

这是我的代码片段:

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

我需要它是假的

你可以这样解决问题:

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()的参数,你可以用其他东西替换它。

有关使用可变默认参数的危险的更多信息,您可以在此处阅读:Python的隐藏功能:可变默认参数的危险

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

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

我用图片来解释这一点,从 http://holdenweb.com/files/IntroNotes.pdf#page=118

顺便说一下,这些笔记是我的"Python 入门"课程的开源版本的草稿,所以我不胜感激任何反馈。

最新更新