0

我有以下代码:

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

谢谢。

4

2 回答 2

3

只传递一个字符串的问题在于,当您调用 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

于 2018-08-07T21:31:49.967 回答
1

我相信您知道,目前您的代码返回错误,因为keys = list(*args)将字符串age视为可迭代并尝试查找agein self.__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__

于 2018-08-07T21:30:05.480 回答