当前位置: 首页 > news >正文

青岛网站制作公司哪家正规/自助建站系统平台

青岛网站制作公司哪家正规,自助建站系统平台,三河市城乡建设局网站,python php 做网站__getattr____getattr__在当前主流的Python版本中都可用,重载__getattr__方法对类及其实例未定义的属性有效。也就属性是说,如果访问的属性存在,就不会调用__getattr__方法。这个属性的存在,包括类属性和实例属性。 Python官方文档…

__getattr__
__getattr__在当前主流的Python版本中都可用,重载__getattr__方法对类及其实例未定义的属性有效。也就属性是说,如果访问的属性存在,就不会调用__getattr__方法。这个属性的存在,包括类属性和实例属性。

Python官方文档的定义

Called when an attribute lookup has not found the attribute in the usual places (i.e. it is not an instance attribute nor is it found in the class tree for self). name is the attribute name.

 

class ClassA:x = 'a'def __init__(self):self.y = 'b'def __getattr__(self, item):return '__getattr__'if __name__ == '__main__':a = ClassA()# 输出结果 aprint(a.x)# 使用实例直接访问实例存在的实例属性时,不会调用__getattr__方法# 输出结果 bprint(a.y)# 使用实例直接访问实例不存在的实例属性时,会调用__getattr__方法# 输出结果 __getattr__print(a.z)

 

 

__getattribute__
__getattribute__仅在新式类中可用,重载__getattrbute__方法对类实例的每个属性访问都有效。

Python官方文档的定义

Called unconditionally to implement attribute accesses for instances of the class.

示例代码:

class ClassA:x = 'a'def __init__(self):self.y = 'b'def __getattribute__(self, item):return '__getattribute__'if __name__ == '__main__':a = ClassA()# 使用实例直接访问存在的类属性时,会调用__getattribute__方法# 输出结果 __getattribute__print(a.x)# 使用实例直接访问实例存在的实例属性时,会调用__getattribute__方法# 输出结果 __getattribute__print(a.y)# 使用实例直接访问实例不存在的实例属性时,也会调用__getattribute__方法# 输出结果 __getattribute__print(a.z)

运行结果:

__getattribute__
__getattribute__
__getattribute__

另外,当同时定义__getattribute__和__getattr__时,__getattr__方法不会再被调用,除非显示调用__getattr__方法或引发AttributeError异常。

示例代码(__getattr__方法不会再被调用):

class ClassA:def __getattr__(self, item):print('__getattr__')def __getattribute__(self, item):print('__getatttribute__')if __name__ == '__main__':a = ClassA()a.x

运行结果:

__getatttribute__

 

由于__getattr__只针对未定义属性的调用,所以它可以在自己的代码中自由地获取其他属性,而__getattribute__针对所有的属性运行,因此要十分注意避免在访问其他属性时,再次调用自身的递归循环。

当在__getattribute__代码块中,再次执行属性的获取操作时,会再次触发__getattribute__方法的调用,代码将会陷入无限递归,直到Python递归深度限制(重载__setter__方法也会有这个问题)。

示例代码(无限递归):

class ClassA:x = 'a'def __getattribute__(self, item):print('__getattribute__')return self.itemif __name__ == '__main__':a = ClassA()a.x

运行结果引发异常,提示达到最大递归深度

ecursionError: maximum recursion depth exceeded

同时,也没办法通过从__dict__取值的方式来避免无限递归

class ClassA:x = 'a'def __getattribute__(self, name):return self.__dict__[name]if __name__ == '__main__':a = ClassA()# 无限递归a.x

为了避免无限递归,应该把获取属性的方法指向一个更高的超类,例如object(因为__getattribute__只在新式类中可用,而新式类所有的类都显式或隐式地继承自object,所以对于新式类来说,object是所有新式类的超类)。

修改代码(避免无限递归循环):

class ClassA:x = 'a'def __getattribute__(self, item):print('__getattribute__')return super().__getattribute__(self, item)if __name__ == '__main__':a = ClassA()print(a.x)

运行结果正常:

__getattribute__
a

 

参考资料:

https://docs.python.org/3/reference/datamodel.html

 

转载于:https://www.cnblogs.com/blackmatrix/p/5681480.html

http://www.jmfq.cn/news/4950937.html

相关文章:

  • 拖拽建设网站源码/优化大师怎么提交作业
  • 免费vue前端模板网站/百度竞价广告代理
  • 怎么做模板网站的报价表/网络营销都有哪些形式
  • 安心保险官方网站/成都企业seo
  • 网页图片不能正常显示的原因/北京推广优化经理
  • 网站制作和app制作/网站维护中是什么意思
  • 施工企业安全生产评价汇总表最终须由( )签名。/南宁正规的seo费用
  • 网站开发报价单模板/南宁百度推广排名优化
  • 手机网站推广怎么做/典型的口碑营销案例
  • 恩施做网站/域名注册阿里云
  • 网站架构基本知识/杭州关键词排名工具
  • 东营市城市和建设管理局网站/安徽百度seo教程
  • 怎样给网站做后台/合肥网络推广营销
  • 郑州网站建设专业乐云seo/网络营销有哪些模式
  • 湖南建立网站营销策划/程序员培训机构哪家好
  • 长沙网站建设优化/软文写手接单平台
  • 网站建设数据的需求分析/女教师网课入06654侵录屏
  • 购物网站模板免费/促销策略
  • 怎么才可以做网站/互动营销策略
  • 山东做网站建设公司排名/软件推广赚钱一个10元
  • 妇联网网站建设工作/广告推广接单平台
  • 大庆做网站最厉害的人/2345网址导航删除办法
  • 公司网络维护服务方案/杭州百度快照优化排名
  • 公司网站开发说明介绍/seo课堂
  • 做网站后台教程视频/最好看免费观看高清大全
  • 苏州网站建设网站制作的公司/网络整合营销是什么意思
  • 音乐外链生成网站怎么做/泰州百度关键词优化
  • 专业建设 教学成果奖网站/自己如何制作网页
  • 简述网站建设及维护的全过程/棋牌软件制作开发多少钱
  • 物联网管理平台厂家/抚州seo排名