Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python将函数创建为哈希表的父类_Python_Hashtable - Fatal编程技术网

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