【问题标题】:How to implement the __getitem__ dunder method in python to get attribute values?python中如何实现__getitem__ dunder方法获取属性值?
【发布时间】:2019-01-15 01:15:43
【问题描述】:

我有以下代码:

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 方法的参数(可以是一个或多个)获取属性值。

谢谢。

【问题讨论】:

    标签: python methods get attributes python-datamodel


    【解决方案1】:

    我相信您知道,目前您的代码返回错误,因为 keys = list(*args) 将字符串 age 视为可迭代并尝试在其中查找 agself.__dict__。因此,您可以检查提供给__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__ 的值列表。

    【讨论】:

    • 您的代码每次都返回一个列表,即使是一个输出也是如此。但是@Levi Levi 为我解决了这个问题。谢谢。
    • 是的,它会这样做——请参阅返回声明:return [self.__dict__[key] for key in keys]。我倾向于更喜欢函数每次都返回相同的数据类型,这样我就可以使用相同的代码来处理返回,而无需进行另一次类型检查。更清楚地指定您的输入问题预期输出,人们可以更有效地提供帮助。
    【解决方案2】:

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

    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

    【讨论】:

      猜你喜欢
      • 2019-12-15
      • 1970-01-01
      • 1970-01-01
      • 2022-07-07
      • 2013-04-30
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      相关资源
      最近更新 更多