python将函数创建为哈希表的父类
我希望我的类被用作列表,因此我创建了魔法类python将函数创建为哈希表的父类,python,hashtable,Python,Hashtable,我希望我的类被用作列表,因此我创建了魔法类 @dataclass class Magic(Person): position = [] def __new__(cls, pos, person): if pos < len(cls.position): return cls.position[pos] if pos == len(cls.position)+1: instance = cls.
@dataclass
class Magic(Person):
position = []
def __new__(cls, pos, person):
if pos < len(cls.position):
return cls.position[pos]
if pos == len(cls.position)+1:
instance = cls.__new__(cls)# should create new class
cls.position.append(instance)
return instance
else:
raise Exception('out of bound')
def __getitem__(self, pos):
return self.position[pos]
最后,我想把散列填好
a = Magic()
a[0].age = 5
print(a)
我知道我应该在类上创建一个实例,但不知道如何创建
啊,我希望哈希表将按顺序位置创建
无法在[0]之前创建[1]。年龄=5。年龄=5
澄清
而常规列表的行为类似于:
>>> a = list()
>>> a[0] = 5
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
列表还应加强其索引的连续性:
>>> a = Magic(Person)
>>> a[1].age = 5
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
IndexError: list index out of range
>a=Magic(个人)
>>>a[1]。年龄=5岁
回溯(最近一次呼叫最后一次):
文件“”,第2行,在
索引器:列表索引超出范围
我想我自己解决了
一开始,我想使用一种我不太熟悉的方法,所以我分配了一些问题,但最后它成功了
人
class Person:
def __init__(self) -> object:
self.age = 10
魔术师
class MagicList(Person):
def __init__(self):
self.position = []
Person.__init__(self)
def __getitem__(self, key) -> int:
if not self.position or len(self.position) == key:
self.__setitem__(key)
return self.position[key]
elif len(self.position) > key:
return self.position[key]
return None
def __setitem__(self, key):
if not self.position:
self.position.append(Person)
elif len(self.position)-1 >= key:
self.position[key] = Person
elif len(self.position) == key and Person != None:
self.position.append(Person)
并检查我的代码
a = MagicList(Person)
a[0].age = 5
print(a[0].age)
assert a[0].age == 5
a[1].age = 7
print(a[1].age)
assert a[0].age == 7
try:
a[4].age = 11
except AttributeError as ex:
print("Currect AttributeError age {}".format(ex))
你能澄清一下你想做什么吗?描述很难理解。你想解决什么问题?请举例说明您希望如何使用该类,说明您尝试使用该类时会发生什么,并解释这与应该发生的情况有何不同。从最后几部分来看,您不希望在
a[0]
之前设置a[1]
–那么为什么不使用列表而不是dict
?dict
/“hashtable”的目的是允许任何静态键,而不考虑预先存在的键。@MisterMiyagi是的,我在某个时候得到了这个,但现在仍然需要填充,因为非常抱歉,我仍然没有得到它。如果希望Magic
/位置
的行为与列表
完全相同,为什么不使用列表
?
class MagicList(Person):
def __init__(self):
self.position = []
Person.__init__(self)
def __getitem__(self, key) -> int:
if not self.position or len(self.position) == key:
self.__setitem__(key)
return self.position[key]
elif len(self.position) > key:
return self.position[key]
return None
def __setitem__(self, key):
if not self.position:
self.position.append(Person)
elif len(self.position)-1 >= key:
self.position[key] = Person
elif len(self.position) == key and Person != None:
self.position.append(Person)
a = MagicList(Person)
a[0].age = 5
print(a[0].age)
assert a[0].age == 5
a[1].age = 7
print(a[1].age)
assert a[0].age == 7
try:
a[4].age = 11
except AttributeError as ex:
print("Currect AttributeError age {}".format(ex))