如何在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]。我倾向于让函数每次都返回相同的数据类型,这样我就可以使用相同的代码来处理返回,而无需进行其他类型检查。更清楚地指定您的输入、问题和预期输出,人们可以更有效地提供帮助。