python类属性使用,python中的类属性和类方法

  python类属性使用,python中的类属性和类方法

  python中类实例属性的访问以及__getattr__和__getattribute__ 1的方法说明。第2条概述。类实例访问属性的几种方法1。@ p rotated fault])4。obj.name和getattr 3的关系和区别。__getattr__和__getattribute__1。重写_ _

  一.条款概述

  本文基于python官方文档,了解了两种定制方法__getattr__和_ _ getattibute _ _的访问机制

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

  启动三个方法获取python类__getattr__(self,name)和__getattribute__(self,name)实例属性的机制就是基于这个类。

  #-编码:utf-8-# filename: py_category.py类健康小笼包(对象):( asimplexamples ))652 name 352在py_category.py中定义了一个继承obejct(所有类的名称类)的健康小笼包类。类实例化可以

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

  3358www。Sina.com/:属性@property:通过访问类对象obj.name:getattr()获得name属性的值本研究

  1.@物业暂时不解释

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

  #-coding 3360 utf-8-# filename:py _ category . pyif _ name _= _ main _ 3360 GSD=将healthy little name属性的值设置为sensitive ant name 1= sensitive ant 3 . get attr(object,name(,default)))get attr)

  #-coding 3360 utf-8-# filename:py _ category . pyif _ name _= _ main _ 3360 GSD=敏感设置健康小名属性值的蚂蚁获取 name) name2=感知蚂蚁4之间的关系。obj.name和getattr以及这两种访问方法的区别是等价的。你呢?

  注意:如果实例对象有属性,则返回属性值;否则,将引发AttributeError异常

  #-coding 3360 utf-8-# filename:py _ category . pyif _ name _= _ main _ 3360 GSD=ant灵敏设置健康小名属性3的值的方式:getattr(object,name),default])方法是,name属性name2的值=getattr(GSD, name )name 2= emotional ant name 3=getattttttt

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

  getattr(object, name[,default])

  (当然,前提是__getattr__和__getattribute__方法不是为该类定制的。)

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

  Etattr__和__getattribute__方法

  方法的标准定义:对象。__getattr__(self,name)

  对象。__getattribute__(self,name)

  __getattr__()和__getattribute__()的官方描述:

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

  在前面的例子中,我们遇到了AttributeError异常。当访问实例不存在的属性时,会触发此异常:

  #-*-编码:UTF-8-*-# filename:py _ category . pyif _ _ name _= _ main _ _ :GSD=健康小笼包(感性的蚂蚁)name2=getattr(gsd,V) # AttributeError:健康小笼包对象没有属性 V 试图为name2获取GSD的 V 属性时触发attribute error(get attr()方法中未设置默认值)。此时,它尝试调用__getattr__()方法,该方法返回属性值或引发AttributeError异常。因为此方法未被重写,所以还会引发AttributeError异常。

  1.重写__getattr__(self,name)以修改py_category.py,并在健康馒头类中重写__getattr__方法:

  #-*-编码:UTF-8-*-#文件名:py _ category.py类健康小笼包(对象):一个简单的示例类 def _ _ init _ _ (self,Name:str=None):self . Name=Name def _ _ getattr _ _(self,Name):Return _ _ getattr _ _(): Name if _ _ Name _= _ main _ _ :GSD=健康小笼包( sentient )Name 1=GSD . Name #系统默认调用__getattribute__()方法,返回 sensible ant name2调用__getattr__()方法print(name 1)# sensible ant print(name 2)# __getattr__():v可以看到,1通过__getattribute__()方法获取值:感性ant ,2可以通过_ _ getattr _ _()方法获取值: __getattr__(): v

  注意:这里的V是实例对象的属性名,不是属性值。

  2.重写__getattribute__(self,name)修改代码,在健康馒头类中重写__getattribute__方法:

  #-*-编码:UTF-8-*-#文件名:py _ category.py类健康小笼包(对象):一个简单的示例类 def _ _ init _ _ (self,Name:str=None):self . Name=Name def _ _ getattr _ _(self,Name):return _ _ get attribute _ _(self,Name:str):return _ _ get attribute _ _(): Name if _ _ Name _= _ _ main _ _ :GSD=健康小笼包(有知觉的蚂蚁)name1 返回 Sensible Ant name2=getattr(gsd, v) #无一例外,调用__getattribute__()方法print(name 1)# __getattribute__(): name print(name2)# _ _ GetAttr _():v同一个测试代码,1获取值: _ _ GetAttribute _ _():name,name 2也可以通过_ _ GetAttribute _ _()方法获取值: __getattribute__(): v

  注意:这里的name和V是实例对象的属性名,而不是属性值。

  __getattribute__方法没有AttributeError异常,因此将不会调用__getattr__方法。

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

  # .班级健康馒头(对象):#.def _ _ getattribute _ _ (self,name): return super()。_ _ getattribute _ _ (name)这样,当你访问已定义的属性时,你可以正常地访问属性值,但是当你访问未定义的属性时,你将调用__getattr__方法,返回值或属性发生。

  3.文档展开显示无线递归将发生在以下代码中:

  # .班级健康馒头(对象):#.def _ _ getattribute _ _ (self,name):返回self。_ _ getattr _ _ (name)总结获取类实例属性的三种方法:

  1).@property:使用@property decorator来操作类属性。

  2).obj.name:通过类对象访问获取name属性的值。

  3).getattr (object,name [,default]): getattr()方法获得obj.name和getattr()方法的等效,与getattr()方法的默认值不同。如果设置了默认值,getattr()方法可以获得未定义的类实例属性的值:default

  __getattr__()和__getattribute__()可以重写。

  访问属性时,首先调用__getattribute__()方法。当AttributeError异常发生时,该方法调用__getattr__()方法。关于setattr(object,key,value)和__setattr__(self,key,value)的相关内容,请参考python魔法之__setattr_()的链接。

  相关资料的链接:python官方文档(3.8)

  以上就是访问类实例属性和__getattr__()和__getattribute__()方法的访问机制。

  学者能力尚浅。如果有什么建议或意见,请指正。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: