首页 > 编程知识 正文

python实例属性,python_类属性_实例属性

时间:2023-05-04 21:46:02 阅读:160372 作者:568

python中类实例属性的访问以及__getattr__和__getattribute__的方法说明1、文章概要2、类实例访问属性的几种方法1.@ protate default] )4. obj.name与getattr的关系和区别3,__getattr__和__getattribute__1.重写__getattr__(self

一.文章概述

本文基于python官方文档,了解对两个__getattr__和__getattibute__定制方法的访问机制

阅读本文,您将看到以下内容:

启动访问三种获取python类的实例属性的方法__getattr__(self,name )和__getattribute__(self,name )方法的机制本文中所有方法的搜索都基于这个类。

#--coding:utf-8--# filename : py _ category.py class健康小笼包(object ) :(''asimpleexampleclass ' ' ) ) ) ) 652 name 352 在py_category.py中定义继承obejct (所有类的基类)的健康小笼包类,类实例化可以接受可选参数name

二、了解类实例访问属性的几种方法(__getattr__ ()和__getattribute__ () )之前,先探索类实例对象访问属性的几种方法

3358www.Sina.com/:类属性@property:通过访问类对象获取name属性值obj.name:getattr ()此次研究

1. @property还不解释

2 .从2. obj.name类的实例对象访问实例的name属性值

#-- coding 3360 utf-8-- # filename : py _ category.pyif _ name _=' _ main _ ' 3360 GSD=将健康小name属性的值设置为敏感性蚂蚁name1='感性的蚂蚁'3.getattr(object,name (,default] ) ) getattr ) )方法取得属性

#-- coding 3360 utf-8-- # filename : py _ category.pyif _ name _=' _ main _ ' 3360 GSD=敏感地设置健康小name属性的值的蚂蚁获取' name ' ) name2='感性蚂蚁4. obj.name与getattr的关系和区分这两种访问方式是等价的。 你呢

注意:如果实例对象具有属性,则返回属性值;否则抛出AttributeError异常

#-- coding 3360 utf-8-- # filename : py _ category.pyif _ name _=' _ main _ ' 3360 GSD=敏感地设置健康小name属性的值的蚂蚁方式3:getattr(object,name ),default] )方法为,name属性的值name2=getattr(GSD,' name ' ) name2='感性的蚂蚁' name3=getattttttt

从文档中可以明显看出,两种访问方法的区别仅在于getattr ) )方法的default值的设置。

getattr(object, name[,default])

(当然,前提是没有为类定制__getattr__和__getattribute__方法。)

三. 3358www.Sina.com/和如果使用getattr(obj, name[, default])时设置了default值,则不会发生AttributeError异常,而返回值default中,我们不妨讨论一下__g

etattr__和__getattribute__方法

方法的标准定义:
object.__getattr__(self, name)
object.__getattribute__(self, name)

官方文档对__getattr__()和__getattribute__()的说明:

根据文档对__getattribute__(self, name)的阐述,在对类实例属性访问时调用的是该方法,只有该方法主动调用了__getattr__方法或发生了AttributeError时才会调用__getattr__()方法。

在之前的示例中,我们遇到的发生AttributeError异常的情况。当访问实例不存在的属性时,就会触发该异常:

# -*- coding: UTF-8 -*-# filename: py_category.pyif __name__ == '__main__': gsd = 健康的小笼包('感性的蚂蚁') name2 = getattr(gsd, 'v') # AttributeError:'健康的小笼包' object has no attribute 'v'

对name2尝试获取gsd的’v’属性时触发AttributeError(getattr()方法未设置default值),此时会尝试调用__getattr__()方法,此方法返回属性值或引发AttributeError异常。因为没有对该方法进行重写,所以同样引发了AttributeError异常

1. 重写__getattr__(self, name)

修改py_category.py,在健康的小笼包类中重写__getattr__方法:

# -*- coding: UTF-8 -*-# filename: py_category.pyclass 健康的小笼包(object): '''A simple example class''' def __init__(self, name: str=None): self.name = namedef __getattr__(self, name): return '__getattr__(): ' + nameif __name__ == '__main__': gsd = 健康的小笼包('感性的蚂蚁') name1 = gsd.name # 系统默认调用 __getattribute__()方法,返回'感性的蚂蚁' name2 = getattr(gsd, 'v') # 发生AttributeError异常,调用__getattr__()方法 print(name1) # 感性的蚂蚁 print(name2) # __getattr__(): v

可以看到,name1通过__getattribute__()方法获得值:‘感性的蚂蚁’,name2可以通过__getattr__()方法获得值:’__getattr__(): v’

注意:这里的v是实例对象的属性名称,而非属性值

2. 重写__getattribute__(self, name)

修改代码,在健康的小笼包类中重写__getattribute__方法:

# -*- coding: UTF-8 -*-# filename: py_category.pyclass 健康的小笼包(object): '''A simple example class''' def __init__(self, name: str=None): self.name = namedef __getattr__(self, name): return '__getattr__(): ' + name def __getattribute__(self, name:str): return '__getattribute__(): ' + nameif __name__ == '__main__': gsd = 健康的小笼包('感性的蚂蚁') name1 = gsd.name # 系统默认调用 __getattribute__()方法,返回'感性的蚂蚁' name2 = getattr(gsd, 'v') # 未发生异常,调用__getattribute__()方法 print(name1) # __getattribute__(): name print(name2) # __getattr__(): v

同样的测试代码,name1获得值:’__getattribute__(): name,name2也可以通过__getattribute__()方法获得值:’__getattribute__(): v’

注意:这里的name和v是实例对象的属性名称,而非属性值

__getattribute__方法并未发生AttributeError异常,是不会调用__getattr__方法的

接下来修改__getattribute__方法的重定义:

# ...class 健康的小笼包(object): # ... def __getattribute__(self, name): return super().__getattribute__(name)

这样访问已定义的属性时可以正常访问到属性值,而访问未定义的属性时,会调用__getattr__方法,返回值或发生AttributeError异常

3. 文档扩展说明

如下代码将会发生无线递归:

# ...class 健康的小笼包(object): # ... def __getattribute__(self, name): return self.__getattr__(name) 总结 获取类实例属性的三种方式:
1). @property:使用@property装饰器操作类属性
2). obj.name:通过类对象访问获取name属性的值
3). getattr(object, name[,default]):getattr()方法获取

obj.name和getattr()方法等效,区别与getattr()方法的default值。如果设置了default值,则getattr()方法可以获取未定义的类实例属性的值:default

__getattr__()和__getattribute__()可重写
访问属性时,优先调用__getattribute__()方法。该方法发生AttributeError异常时调用__getattr__()方法 相关内容

关于setattr(object, key, value)和__setattr__(self, key, value),参考链接: python魔法方法之__setattr__()

相关资料

链接: python官方文档(3.8)


以上就是访问类实例属性以及__getattr__()和__getattribute__()方法的访问机制全部内容了

学者能力尚浅,如有建议或意见,欢迎指正批评

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。