如何在python中实现_getitem__; dunder方法来获取属性值?
我有以下代码:如何在python中实现_getitem__; dunder方法来获取属性值?,python,methods,get,attributes,python-datamodel,Python,Methods,Get,Attributes,Python Datamodel,我有以下代码: 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__':
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方法
谢谢。我相信您也知道,当前您的代码返回了一个错误,因为keys=list*args将字符串age视为一个iterable,并尝试在self中查找a、g和e。因此,您可以检查给定给u_getitem_u_u的参数类型,并对参数执行适当的转换,以获取要返回的键:
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的值列表。只传递一个字符串的问题在于,当调用p['age']时,*args的类型是一个字符串,因此list*args变为['a','g','e']。当您同时传递“age”和“name”时,*args将被解释为一个元组,您将得到相应的结果。处理此问题的一种方法是检查getitemself、*args方法中*args参数的类型。下面的修改将解决Python3面临的问题,不过您可能需要稍微清理一下 班级人员: 定义初始自我、姓名、年龄: self.name=名称 self.age=年龄 def\uu getitem\uu self,*参数: 如果isinstance*args,str: 返回self.\uuuu dict\uuuu[str*args] keys=list*args 返回[self.\uuu dict.\uuuu[key]用于键入键] 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': p=人员'A',20 年龄=p[“年龄”] 印刷术 name=p['name'] 打印名 姓名,年龄=p['name','age'] 打印名、年龄 控制台输出: 20 A.
代码每次返回一个列表,即使是一个输出。但是@Levi Levi帮我解决了这个问题。谢谢。是的,它会这样做-请参阅return语句:return[self.\uu dict\uuu[key]用于key-in-key]。我倾向于让函数每次都返回相同的数据类型,这样我就可以使用相同的代码来处理返回,而无需进行其他类型检查。更清楚地指定您的输入、问题和预期输出,人们可以更有效地提供帮助。