Python 对象初始化错误。还是我误解了对象的工作原理?

标签 python mutable arguments

  1 import sys
  2 
  3 class dummy(object):
  4     def __init__(self, val):
  5         self.val = val
  6 
  7 class myobj(object):
  8     def __init__(self, resources):
  9         self._resources = resources
 10 
 11 class ext(myobj):
 12     def __init__(self, resources=[]):
 13         #myobj.__init__(self, resources)
 14         self._resources = resources
 15 
 16 one = ext()
 17 one._resources.append(1)
 18 two = ext()
 19 
 20 print one._resources
 21 print two._resources
 22 
 23 sys.exit(0)

这将为 onetwo 对象打印对分配给 one._resources 的对象的引用。我认为 two 将是一个空数组,因为如果在创建对象时未定义它,它显然将其设置为空数组。取消注释 myobj.__init__(self, resources) 做同样的事情。使用 super(ext, self).__init__(resources) 也可以做同样的事情。

我让它工作的唯一方法是使用以下内容:

two = ext(dummy(2))

我不应该在创建对象时手动设置默认值来完成这项工作。或者也许我会。有什么想法吗?

我用 Python 2.5 和 2.6 试过了。

最佳答案

你应该改变

def __init__(self, resources=[]):
    self._resources = resources

def __init__(self, resources=None):
    if resources is None:
        resources = []
    self._resources = resources

一切都会好起来的。这是处理默认参数(如果它们是可变的)的详细信息。在 this page 的讨论部分有更多信息。 .

关于Python 对象初始化错误。还是我误解了对象的工作原理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1534407/

相关文章:

python - wxpython:如何访问放置在 wx.Sizer 对象中的对象?

C++ 可变多类型数组

javascript - 是否可以使用隐藏/额外参数初始化变量?

python - Google App Engine 上的只读关系数据库?

python - 从 Pandas 的上一行中查找值

rust - 迭代获取子节点的可变引用

python - 利用函数参数的一次性绑定(bind)是个坏主意吗?

c# - 如何修复参数异常系统中的错误

vbscript - runas 不允许复杂的参数?

Python 3 - 查找出现在多个列表中的字符串,该列表由函数参数填充