python创建父类函数作为哈希表

问题描述

我希望我的班级被用作列表,因此我创建了魔术班

@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]

这个类扩展Person类,应该包含内容

@dataclass
class Person(type):
    age: int = 1

最后我想填满哈希

a = Magic()
a[0].age = 5
print(a)

我知道我应该在类上创建一个实例,但不明白如何 啊,我希望将在订单位置创建哈希表 我无法在 a[0].age =5 之前创建 a[1].age =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[0].age = 5
>>> print(a)
[Person(age=5)]

并且该列表还应强制其索引连续性:

>>> a = Magic(Person)
>>> a[1].age = 5
Traceback (most recent call last):
File "<stdin>",line 2,in <module>
IndexError: list index out of range

解决方法

我想我自己解决了 一开始我想使用一种我不太熟悉的方法,所以我遇到了很多问题,但最后它起作用了!

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))