如何将一些内置方法转移到类变量?

时间:2017-12-19 21:50:48

标签: python python-3.x class inheritance

我有一个类,我希望通过类变量实现类似列表或类似dict的行为。

position:realtive

我希望使用一些列表方法调用Property,例如append(),pop(),index()以使用self.data变量作为列表。

class Property(list):
    def __init__(self, data: list = None, name: str):
        self.data = data or []
        self.name = name

prop = Property([1,2,3,4,5,6,7,8,9,10], 'property')
print(prop[1])  # 2
print(prop[:3])  # [1, 2, 3]
print(prop.name)  # 'property'

同样,我希望它能直接使用类似dict的方法的self.data变量。

有没有办法用class Node(dict): def __init__(self, data: dict = None): self.data = data or {} self.order = [] for x in data: # do stuff to fill data & order node = Node({'a': '1', 'b': '2', 'c': '3'}) print(node.keys()) # ['a', 'b', 'c'] print('c' in node) # True print(node['b']) # '2' print(node.order) # some ordered list

这样做

1 个答案:

答案 0 :(得分:0)

您需要collections模块中的UserList和UserDict类。通过直接从内置列表和dict类型继承,您无法获得所期望的行为,因为它们在C中实现(至少在CPython中),因此这些类是为此目的而创建的。

from collections import UserList, UserDict, OrderedDict

class Property(UserList):
    def __init__(self, data: list = None, name: str = None):
        self.data = data or []
        self.name = name

prop = Property([1,2,3,4,5,6,7,8,9,10], 'property')
print(prop[1])  # 2
print(prop[:3])  # [1, 2, 3]
print(prop.name)  # 'property'

class Node(UserDict):
    def __init__(self, data: dict = None):
        self.data = OrderedDict(data) if data else OrderedDict()

node = Node({'a': '1', 'b': '2', 'c': '3'})
print(node.keys())  # KeysView(OrderedDict([('a', '1'), ('b', '2'), ('c', '3')]))
print([c for c in node.keys()]) # ['a','b','c']
print('c' in node)  # True
print(node['b'])  # '2'

你需要在你的dict课上做更多的工作,但我认为你可以解决这个问题。

值得注意的是,您可以使用OrderedDict获取节点数据,这样可以为您提供所需的订单。