我有以下代码:
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__
中查找a
、g
和e
。因此,您可以检查给定给__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__
的值列表。