我有一个类,我希望通过类变量实现类似列表或类似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
?
答案 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获取节点数据,这样可以为您提供所需的订单。