首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类ListAccess(列表),在Python中有2个列表

类ListAccess(列表),在Python中有2个列表
EN

Stack Overflow用户
提问于 2017-06-01 09:52:53
回答 1查看 157关注 0票数 2

我在python中找到了实现一个名为AccessList(类型列表)的类的任务:

  • 创建一个类AccessList( list ),它的行为类似于具有以下特性的“正常”列表:
  • 有一个管理的第二个实习生列表,其中书签了最后一个询问元素( intern )。只有属性" access“才能读取对此列表的访问。
  • 如果存在内部测试,则应将所询问的元素添加到第二个列表中。
  • 如果迭代AccessList的实例,则access属性不应更改自身。

示例:

代码语言:javascript
复制
>>>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]

所以这是我的尝试:

代码语言:javascript
复制
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)

但现在我不知道如何实现测试?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-01 10:12:46

__contains__方法负责管理in检查:

代码语言:javascript
复制
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列表中的实例!

它通过了你的测试:

代码语言:javascript
复制
>>> 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]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44304275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档