Python deepcopy(ing)从列表继承并重写append的TypedList类时出现问题
我不明白为什么TypeList类的新实例没有my_type属性 这是我的密码:Python deepcopy(ing)从列表继承并重写append的TypedList类时出现问题,python,deep-copy,Python,Deep Copy,我不明白为什么TypeList类的新实例没有my_type属性 这是我的密码: import copy class TypedList(list): def __init__(self, typeof, iterable=''): """ Initialize the typed list. Examples: tmp = TypedList(str, 'foobar') # OK tmp = Typed
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 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
奇怪,我刚刚下载并编译了pyhton 2.7源代码。我仍然有这个问题。