深度复制问题,从列表继承并覆盖附加的TypedList类

问题描述 投票:1回答:1

我不明白为什么TypeList类的新实例没有my_type属性。

这是我的代码:

import copy

class TypedList(list):
    def __init__(self, typeof, iterable=''):
        """
        Initialize the typed list.

        Examples:
        tmp = TypedList(str, 'foobar') # OK
        tmp = TypedList('str', 'foobar') # FAIL!
        """
        if not issubclass(type(typeof), object):
            raise TypeError('typeof must inherit from object')

        if type(typeof) is not type:
            raise TypeError('typeof, argument must be a python object type.\n'
              'Not a string stating the type of python object.\n'
              'Example: TypedList(str), not Typedlist("str")')

        self.my_type = typeof

        for item in iterable:
            if type(item) != self.my_type:
                raise TypeError('%s is of type %s; it should be type %s' %
                  (item, type(item), self.my_type))

        super(TypedList, self).__init__(iterable)

    def append(self, item):
        """
        Append an item to the typed list.
        """
        if type(item) != self.my_type:
            raise TypeError('item must be of type %s' % self.my_type)

        return super(TypedList, self).append(item)

if __name__ == '__main__':
    foo = TypedList(str, 'test')
    bar = copy.deepcopy(foo)

执行它会返回此输出:

$ python tl.py 

Traceback (most recent call last):

  File "tl.py", line 53, in <module>

    bar = copy.deepcopy(foo)

  File "/usr/lib/python2.6/copy.py", line 189, in deepcopy

    y = _reconstruct(x, rv, 1, memo)

  File "/usr/lib/python2.6/copy.py", line 329, in _reconstruct

    y.append(item)

  File "tl.py", line 46, in append

    if type(item) != self.my_type:

AttributeError: 'TypedList' object has no attribute 'my_type'
python deep-copy
1个回答
0
投票

我刚刚使用Python 2.5和Python 2.7测试了您的脚本,并且可以正常工作:

import copy

class TypedList(list):

  def __init__(self, typeof, iterable=''):
    """ Initialize the typed list.

    Examples:
    tmp = TypedList(str, 'foobar') # OK
    tmp = TypedList('str', 'foobar') # FAIL!
    """
    if not issubclass(type(typeof), object):
        raise TypeError('typeof must inherit from object')

    if type(typeof) is not type:
        raise TypeError('typeof, argument must be a python object type.\n'
          'Not a string stating the type of python object.\n'
          'Example: TypedList(str), not Typedlist("str")')

    self.my_type = typeof

    for item in iterable:
        if type(item) != self.my_type:
            raise TypeError('%s is of type %s; it should be type %s' %
              (item, type(item), self.my_type))

    super(TypedList, self).__init__(iterable)

def append(self, item):
    """
    Append an item to the typed list.
    """
    if type(item) != self.my_type:
        raise TypeError('item must be of type %s' % self.my_type)

    return super(TypedList, self).append(item)

if __name__ == '__main__':
    foo = TypedList(str, 'test')
    bar = copy.deepcopy(foo)
    assert foo.my_type is bar.my_type
© www.soinside.com 2019 - 2024. All rights reserved.