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

2024-05-23 17:10:03 发布

您现在位置:Python中文网/ 问答频道 /正文

  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)也可以做同样的事情。在

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

^{pr2}$

我不应该在创建对象时手动设置默认值来实现这一点。或许我会。有什么想法吗?在

我使用Python2.5和2.6进行了尝试。在


Tags: 对象selfobjectinitdefsysvalone
3条回答

你应该换衣服

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

^{pr2}$

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

您的问题是,默认值是在函数定义时计算的。这意味着同一个列表对象在实例之间共享。更多讨论请参见答案to this question。在

有关如何从__init__()设置类的讨论,请阅读this answer。您遇到了一个众所周知的Python怪癖:您试图设置一个可变表,而在编译__init__()时,您的可变表将被计算一次。标准的解决方法是:

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

相关问题 更多 >