我在python中找到了实现一个名为AccessList(类型列表)的类的任务:
示例:
>>>a = AccessList()
>>>a.extend([1,2,3])
>>>a
[1,2,3]
>>>a.access
[]
>>>5 in a, 1 in a
False, True
>>>a.access
[1]
>>>1 in a, 3, in a
True, True
>>>a.access
[3,1,1]
>>>a.access.insert(0,17)
>>>a.access
[3,1,1]所以这是我的尝试:
class AccessList(list):
def __init__(self, lis=()):
list.__init__(self, lis)
self._access = []
def _get_access(self):
return self._access[:]
access = property(_get_access, None, None, None)但现在我不知道如何实现测试?
发布于 2017-06-01 10:12:46
__contains__方法负责管理in检查:
class AccessList(list):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._access = []
@property
def access(self):
return self._access[::-1] # return a reversed copy
def __contains__(self, item):
res = super().__contains__(item) # check if it contains the item
if res:
self._access.append(item) # if it's contained append it to access
return res我在这里做了一些没有真正改变功能但被认为是很好的风格的更改:
super而不是显式地对超类进行硬编码。@property创建属性。*args, **kwargs中的__init__并将它们传递给超类__init__。您不关心传递给__init__的是什么,这样您就可以接受任何东西,让超类知道应该做什么。self._access.copy()而不是self._access[:]。我觉得发生了什么就更清楚了。但是,如果列表可能包含需要使用copy.deepcopy(self._access)的可变对象,则可以更改_access列表中的实例!它通过了你的测试:
>>> a = AccessList()
>>> a.extend([1,2,3])
>>> print(a)
[1, 2, 3]
>>> print(a.access)
[]
>>> print(5 in a, 1 in a)
False True
>>> print(a.access)
[1]
>>> print(1 in a, 3 in a)
True True
>>> print(a.access)
[3, 1, 1]
>>> a.access.insert(0,17)
>>> print(a.access)
[3, 1, 1]https://stackoverflow.com/questions/44304275
复制相似问题