如何在python中实现__getitem__ dunder方法获取属性值?
How to implement the __getitem__ dunder method in python to get attribute values?
我有以下代码:
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 方法的参数(可以是一个或多个)获取属性值。
谢谢。
我相信您知道,目前您的代码 return 是一个错误,因为 keys = list(*args)
将字符串 age
视为可迭代对象并尝试寻找 [= self.__dict__
中的 13=、g
和 e
。因此,您可以检查给定 __getitem__
的参数类型并执行 args
的适当转换以将 keys
变为 return:
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__
.
的值列表
仅传递一个字符串的问题在于,当您调用 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
我有以下代码:
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 方法的参数(可以是一个或多个)获取属性值。
谢谢。
我相信您知道,目前您的代码 return 是一个错误,因为 keys = list(*args)
将字符串 age
视为可迭代对象并尝试寻找 [= self.__dict__
中的 13=、g
和 e
。因此,您可以检查给定 __getitem__
的参数类型并执行 args
的适当转换以将 keys
变为 return:
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__
.
仅传递一个字符串的问题在于,当您调用 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