如何在python中实现__getitem__dunder方法来获取属性值



我有以下代码:

class Personne:
def __init__(self, name, age):
self.name = name
self.age = age
def __getitem__(self, *args):
keys = list(*args)
return [self.__dict__[key] for key in keys]

if __name__ == '__main__':
p = Personne('A', 20)
# age = p['age']
# print(age)
# name = p['name']
# print(name)
name, age = p['name', 'age']
print(name, age)

未注释的部分运行良好,但注释的代码中存在问题。如何实现所需的行为,即根据传递给getitem方法的参数(可以是一个或多个(获取属性值。

谢谢。

只传递一个字符串的问题在于,当您调用p[‘age’]时,*args的类型是一个字符串,因此list(*args(变为[‘a’,‘g’,‘e’]。当您同时传递"age"one_answers"name"时,*参数将被解释为元组,并获得适当的结果。处理此问题的一种方法是检查getitem(self,*args(方法中*args参数的类型。以下修改将解决您所面临的问题(Python3(,不过您可能需要稍微清理一下。

class Personne:
def __init__(self, name, age):
self.name = name
self.age = age
def __getitem__(self, *args):
if isinstance(*args, str):
return self.__dict__[str(*args)]
keys = list(*args)
return [self.__dict__[key] for key in keys]
if __name__ == '__main__':
p = Personne('A', 20)
age = p['age']
print(age)
name = p['name']
print(name)
name, age = p['name', 'age']
print(name, age)


CONSOLE OUTPUT : 
20
A
A 20

我相信您已经知道,当前您的代码返回一个错误,因为keys = list(*args)将字符串age视为可迭代字符串,并尝试在self.__dict__中查找age。因此,您可以检查给定给__getitem__的参数的类型,并对args执行适当的转换,以使keys返回:

class Personne:
def __init__(self, name, age):
self.name = name
self.age = age
def __getitem__(self, args):
if isinstance(args, str):
keys = [ args ] # args is a string
else:
keys = list(args) # args is a tuple
return [self.__dict__[key] for key in keys]

输出将是来自self.__dict__的值列表。

最新更新