python函数的使用场景_Python内置函数getattr的使用场景

一、getattr函数的作用是什么?

在Python交互式的help环境下,输入getattr,回车,会得到下面的信息:

python函数的使用场景_Python内置函数getattr的使用场景_第1张图片

阅读上图的信息,我们对getattr函数可以有如下认识:

它接受两个位置参数——object和name,还接受一个可选参数——default

参数object是一个对象

参数name的类型是字符串,它是对象object的属性名字

如果我们有一个对象叫alex,他有一个属性是age,那么getattr(alex,'age')得到的结果和alex.age是一样的

如果我们不确定对象alex是否有一个weight属性,我们依然可以使用getattr(alex,'weight',0)来尝试获取。如果不存这个属性,就会返回0,因为我们设置了default参数的值为0,这个0就是在属性不存在时返回的默认值。

二、什么时候需要使用getattr呢?

既然getattr(alex,'age') 和 alex.age都能获取alex对象的age属性的值,那我们使用后者不就行了吗?毕竟点语法看起来比getattr函数简单多了,不用写那么多字。确实,一般情况下,使用点语法来获取属性值非常方便。但是也存在一些场景,点语法无能为力,只好使用getattr函数来获取属性值。

究竟应该使用谁,关键就在于,编写代码的时候程序员是否能够确定要获取哪个属性的值。

如果我明确地知道,我就是想要获取age这个属性的值,那么alex.age就满足了我的需求。但是,试想如下的场景:

alex对象有name,age,job,weight,height五个属性,我们要根据用户的选择来展示相应的属性。也就是说,用户告诉程序“给我看看alex的身高吧!”,程序就要把height属性的值展示给用户看。

上面这个场景中,程序员写代码的时候无法确定要访问哪个属性值,选择权是交给用户的。而用户的输入是一个字符串"height",字符串在alex.height这样的点语法里并没有容身之处。怎么样?这个需求用点语法不太合适了吧?(如果非要用点语法,也不是不可以。比如,用一个字典把alex所有的属性值都存起来。键就是“height”这样的字符串,值就是alex.height这样的属性值。那么,就可以用“height"这样的字符串把对应的属性值取出来了。不过这个方法没有接下来要说到的getattr好。)这时候,用getattr就非常合适了。因为,getattr的第二个参数类型正是字符串!我们可以用getattr(alex,"height")来取出身高的值。我们甚至还可以使用default参数很好地解决用户输入的属性不存在的问题。

示例代码如下:

from typing import NamedTuple

class Person(NamedTuple):

'''人类'''

name: str

age: int

job: str

weight: float

height: float

alex = Person('Alex', 32, 'actor', 60, 178)

# 把用户输入的字符串赋值给变量attribute_name

attribute_name = input('''What do you want to know about Alex?

Enter an attribute name>>>''')

# 注意,上述字符串被传进了这个函数作为第二个参数

# 第三个参数是属性不存在时返回的字符串

print(getattr(alex,attribute_name, 'Sorry, this attribute does not exist.'))

以上就是getattr函数非常常用的一个使用场景,也是我在观察其他优秀代码时总结出的经验。如果你还知道其他适合这个函数的场景,欢迎在评论区留言讨论。

如果这篇博文帮到了你,就请给我点个赞吧(#^.^#)

有疑问也欢迎留言~博主可nice啦,在线秒回ヾ(◍°∇°◍)ノ゙

你可能感兴趣的:(python函数的使用场景)