前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python中dir,hasattr,getattr,setattr,vars的使用

Python中dir,hasattr,getattr,setattr,vars的使用

作者头像
Python碎片公众号
发布2021-02-26 14:49:36
1.4K0
发布2021-02-26 14:49:36
举报

Python一切皆对象,对象都有很多属性和方法,使用时我们怎么知道对象有哪些属性,以及如何获取对象的属性和设置对象的属性呢?

Python提供了dir,hasattr,getattr,setattr,vars等函数,可以帮助我们操作和使用对象的属性。

一、dir([object])

dir函数的目的是交互式使用,因此没有提供完整的属性列表,只列出一组“重要的”属性名。

dir函数能审查有或没有 __dict__ 属性的对象。dir函数不会列出 __dict__ 属性本身,但会列出其中的键。dir函数也不会列出类的几个特殊属性,例如 __mro__、__bases__ 和 __name__。

总结来说就是,dir可以列出对象大部分的属性。

代码语言:javascript
复制
class Women(object):
 
    def __init__(self, name, age, height):
        self.name = name
        self.age = age
        self.height = height
 
    def shop(self):
        print("Go Shopping!")
 
    def photo(self):
        print('Photo self!')
 
 
wo = Women('kitty', 18, 1.57)
print(dir(wo))

运行结果:

代码语言:javascript
复制
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', 
'__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__',
 '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', 
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', 
'__subclasshook__', '__weakref__', 'age', 'height', 'name', 'photo', 'shop']

dir函数列出了我们自定义的类Women的大部分属性,其中有我们定义的name,age,height属性,shop,photo方法。

同时还有很多内置的方法,如:__getattribute__, __setattr__ 方法分别是接下来我们要说的getattr(), setattr()函数的底层方法。

__delattr__是调用del删除属性时会调用的方法。

二、getattr(object, name[, default])

获取对象object的属性或者方法,如果存在则打印出来,如果不存在,打印默认值,默认值可选。

从object对象中获取name字符串对应的属性。获取的属性可能来自对象所属的类或父类。如果没有指定的属性,getattr函数抛出AttributeError异常,或者返回 default 参数的值(如果设定了这个参数的话)。

注意:如果返回的是对象的方法,则打印结果是:方法的内存地址,如果需要运行这个方法,可以在后面添加括号()。

代码语言:javascript
复制
print(getattr(wo, 'name'))
# print(getattr(wo, 'friend'))
print(getattr(wo, 'friend', 'me'))
shop = getattr(wo, 'shop')
shop()

运行结果:

代码语言:javascript
复制
kitty
me
Go Shopping!

接着使用上面定义的类,我们可以获取Women对象已有的属性和方法,如果获取没有的属性和方法,会报错。

如果是对象没有的属性,我们可以设置默认值,则getattr会返回这个默认值。

getattr获取对象的方法时,会返回一个方法对象,我们可以像执行函数一样执行这个方法。

三、setattr(object, name, value)

给对象的属性赋值,若属性不存在先创建再赋值,setattr返回值为None,设置成功后要通过getattr来获取属性。

把object对象指定属性的值设为value,前提是object对象能接受那个值。这个函数可能会创建一个新属性,或者覆盖现有的属性。

代码语言:javascript
复制
setattr(wo, 'height', 1.66)
print(getattr(wo, 'height'))
setattr(wo, 'home', 'sz')
print(getattr(wo, 'home'))

运行结果:

代码语言:javascript
复制
 
1.66
sz

继续使用上面的类,对象有height属性,setattr会将height的值修改。对象没有home属性,setattr会创建home属性再给home属性赋值。

四、hasattr(object, name)

判断一个对象里面是否有指定的属性或者方法,返回bool值,有指定属性(方法)返回True,否则返回 False。

如果object对象中存在指定的属性,或者能以某种方式(例如继承)获取指定的属性,返回True。

这个函数的实现方法是调用getattr(object, name) 函数,看看是否抛出AttributeError异常。

代码语言:javascript
复制
print(hasattr(wo, 'name'))
print(hasattr(wo, 'shop'))
print(hasattr(wo, 'job'))

运行结果:

代码语言:javascript
复制
True
True
False

继续使用上面的类,对象有name属性,有shop方法,所以hasattr返回True,对象没有job属性也没有job方法,所以hasattr返回False。

五、vars([object])

返回object 对象的 __dict__ 属性,如果实例所属的类定义了__slots__ 属性,实例没有__dict__属性,那么 vars 函数不能处理这个实例(相反,dir函数能处理这样的实例)。如果没有指定参数,那么vars()函数的作用是返回表示本地作用域的字典。

代码语言:javascript
复制
print(vars(wo))

运行结果:

代码语言:javascript
复制
{'name': 'kitty', 'age': 18, 'height': 1.57}

继续使用上面的类,我们将setattr、getattr的代码注释掉,然后打印对象的vars函数,返回结果是本地作用域中定义的属性和属性值构成的字典。

也就是我们在本地定义的类的属性,如果通过setattr给对象添加属性,则vars中也会有添加的属性,返回的结果是属性名和属性值构成的字典。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python 碎片 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档