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

长沙做网站的费用google优化推广

长沙做网站的费用,google优化推广,武汉专业做网站团队,java开发手机网站开发引言 在上一篇文章中,我们简单回顾了Python中在继承语境下的属性解析顺序,同时补充了能够控制、影响属性解析的3个函数/方法(2个魔术方法 1个内置函数),相信对Python中属性的解析,相较于MRO,有…

引言

在上一篇文章中,我们简单回顾了Python中在继承语境下的属性解析顺序,同时补充了能够控制、影响属性解析的3个函数/方法(2个魔术方法 + 1个内置函数),相信对Python中属性的解析,相较于MRO,有了更进一步的认识。

今天这篇文章中,我们将考虑属性描述符存在的情况下,对于Python中的属性解析顺序又会产生怎样的影响,从而给出一个更加完整的实例对象的属性解析顺序。

属性描述符的种类

前面已经介绍过属性描述符的定义及使用,其实属性描述符根据所实现的魔术方法的不同,可以分为两种类型:

1、数据描述符:同时定义了__get__()和__set__()方法,或者定义了__set__()方法(仅定义__set__,其实没有太大意义)的属性描述符为“数据描述符”。

2、非数据描述符:仅定义了__get__()方法的描述符,称为“非数据描述符”。

接下来,我们分别定义一个数据描述符和非数据描述符,直接看代码:

# 定义一个数据描述符
class IntProperty:def __init__(self, min_value=None, max_value=None):self._value = Noneself.min_value = min_valueself.max_value = max_valuedef __get__(self, instance, owner):return self._valuedef __set__(self, instance, value):if self.min_value is not None and value < self.min_value:raise ValueError(f'必须要大于等于{self.min_value}')if self.max_value is not None and value > self.max_value:raise ValueError(f'必须要小于等于{self.max_value}')self._value = value# 定义一个非数据描述符
class NotDataProperty:def __init__(self, value):self._value = valuedef __get__(self, instance, owner):return self._valueclass DaGongRen:count = 0age = IntProperty(18, 120)team = NotDataProperty('游兵散勇')def __init__(self, name):self.name = nameDaGongRen.count += 1class Programmer(DaGongRen):def __init__(self, name, gender):super().__init__(name)self.gender = genderif __name__ == '__main__':coder = Programmer('张三', '女')print(coder.__dict__)# 数据描述符coder.age = 20print(coder.age)print(coder.__dict__)coder.__dict__['age'] = 35print(coder.__dict__)print(coder.age)print(coder.__dict__['age'])# 非数据描述符print(coder.team)print(coder.__dict__)coder.team = '正规组织'print(coder.__dict__)print(coder.team)print(coder.__dict__['team'])

执行结果:

d7cd92bfd31cd8c50ef18b0ff4135533.jpeg

代码中,我们分别定义了一个数据描述符和一个非数据描述符。其中,数据描述符是一个整数的属性描述符,用于控制属性的合法取值范围。非数据描述符定义了一个打工人所属组织的一个初始默认值,实现的功能是如果一个实例对象没有重新设置team,则始终返回默认值,一旦设置了team属性,则取属性自身的team取值,而不会影响到新的实例对象的取值。

通过代码及执行结果,我们可以大概得出以下结论:

1、数据描述符其实是将属性整个托管给描述符机制了,不管是对属性的访问还是修改,都是基于描述符实现的,相关的数据不会在实例对象的命名空间也就是__dict__字典中体现。

2、即使我们手动在实例对象的__dict__中显式添加一个与数据描述符同名的属性,通过“点”操作符访问到的仍然是数据描述符对应的属性。

3、不同于数据描述符的统一接管,非数据描述符只接管了属性的访问操作。而且,一旦对该属性进行了修改操作,则会在实例对象的命名空间__dict__字典中添加同名属性,后续对该属性的访问,都是对__dict__中的同名属性的访问及修改了。

完整的属性解析顺序

首先给出相对完整的属性解析顺序的结论,之后再通过代码进行演示验证结论。

当通过实例对象“点”操作符访问属性或者等价的getattr()内置函数的形式访问属性时,会按照以下顺序进行属性的解析:

1、首先调用__getattribute__()魔术方法,进行统一的属性访问控制逻辑的执行。

2、如果要访问的属性时数据描述符,则__getattriubte__()方法的内部会进行数据描述符__get__()方法的调用,返回相应的属性值,属性解析结束。

3、如果属性在实例对象的命名空间__dict__字典中,则直接返回,属性解析结束。

4、如果属性在实例对象所属类的命名空间,即__class__.__dict__字典中,则直接返回,属性解析结束。

5、如果属性在示例对象所属类的基类(按照MRO顺序进行解析查找)的__dict__字典中,则直接返回,属性解析结束。

6、如果存在同名的非数据描述符,则调用其__get__()方法,返回属性值,属性解析结束。

7、如果实例对象所属类有定义__getattr__()方法,则调用__getattr__()方法,属性解析结束。

8、属性解析失败,抛出AttributeError。

对应的流程图如下:

接下来,以一个完整的代码示例,来演示属性解析顺序:

# 定义一个数据描述符
class IntProperty:def __init__(self, min_value=None, max_value=None):self._value = Noneself.min_value = min_valueself.max_value = max_valuedef __get__(self, instance, owner):return self._valuedef __set__(self, instance, value):if self.min_value is not None and value < self.min_value:raise ValueError(f'必须要大于等于{self.min_value}')if self.max_value is not None and value > self.max_value:raise ValueError(f'必须要小于等于{self.max_value}')self._value = value# 定义一个非数据描述符
class NotDataProperty:def __init__(self, value):self._value = valuedef __get__(self, instance, owner):return self._valueclass DaGongRen:count = 0age = IntProperty(18, 120)team = NotDataProperty('游兵散勇')def __init__(self, name):self.name = nameDaGongRen.count += 1def __getattribute__(self, item):print(f"尝试访问属性{item}")return super().__getattribute__(item)class Programmer(DaGongRen):def __init__(self, name, gender):super().__init__(name)self.gender = genderdef my_getattr(obj, item):print(f'属性{item}不存在')return Noneif __name__ == '__main__':coder = Programmer('张三', '女')# 当前实例对象的命名空间print(coder.__dict__)# 所属类的命名空间print(Programmer.__dict__)# 所属类的基类的命名空间print(DaGongRen.__dict__)print(f"{'=' * 10} 1、访问普通实例属性name {'=' * 10}")print(coder.name)print(f"{'=' * 10} 2、访问普通类属性属性count {'=' * 10}")print(coder.count)print(f"{'=' * 10} 3、访问非数据描述符team {'=' * 10}")print(coder.team)print(f"{'=' * 10} 4、修改非数据描述符后再访问team {'=' * 10}")coder.team = '一个很正经的产研组织'print(coder.__dict__)print(coder.team)print(f"{'=' * 10} 5、访问数据描述符age {'=' * 10}")print(coder.age)coder.age = 18print(coder.age)print(f"{'=' * 10} 6、显式添加同名数据描述符age到__dict__ {'=' * 10}")coder.__dict__['age'] = 35print(coder.__dict__)print(coder.age)print(f"{'=' * 10} 7、定义__getattr__时访问不存在的属性 {'=' * 10}")Programmer.__getattr__ = my_getattrcoder.skillprint(f"{'=' * 10} 8、未定义__getattr__时访问不存在的属性 {'=' * 10}")del Programmer.__getattr__coder.skill

执行结果:

60731dbbd827cd33834d6c033e57fd0b.jpeg

总结

本文介绍了属性描述符的种类,并比较了不同的属性描述符在属性解析时的差异,最后结合属性描述符、__getattribute__()、__getattr__()及MRO等,给出了一个相对完整的属性解析顺序。

需要说明的是,属性描述符及后面的文章中要介绍的元类的概念,在通常意义的业务场景中是很少用到的。但是,如果涉及到框架的开发或者需要阅读框架的源码时,对这些内容的掌握还是很有必要的。

感谢您的拨冗阅读。如果对您学习Python有所帮助,欢迎点赞、收藏。


文章转载自:
http://wrinkle.rkck.cn
http://banknote.rkck.cn
http://iad.rkck.cn
http://exheredate.rkck.cn
http://skim.rkck.cn
http://proletarianize.rkck.cn
http://beautician.rkck.cn
http://molybdenite.rkck.cn
http://inframedian.rkck.cn
http://quillet.rkck.cn
http://entebbe.rkck.cn
http://whitleather.rkck.cn
http://liken.rkck.cn
http://cstar.rkck.cn
http://indeterminism.rkck.cn
http://appetiser.rkck.cn
http://overdear.rkck.cn
http://initio.rkck.cn
http://haulage.rkck.cn
http://allometry.rkck.cn
http://prelibation.rkck.cn
http://sweeny.rkck.cn
http://travelling.rkck.cn
http://horseless.rkck.cn
http://printout.rkck.cn
http://caboodle.rkck.cn
http://prohibitor.rkck.cn
http://commonable.rkck.cn
http://anglepod.rkck.cn
http://uniformity.rkck.cn
http://anapaest.rkck.cn
http://psilomelane.rkck.cn
http://anthurium.rkck.cn
http://implausible.rkck.cn
http://kymri.rkck.cn
http://junkie.rkck.cn
http://bambino.rkck.cn
http://crofter.rkck.cn
http://palaver.rkck.cn
http://chiba.rkck.cn
http://undercutter.rkck.cn
http://xylophonist.rkck.cn
http://footrace.rkck.cn
http://recidivity.rkck.cn
http://prolongable.rkck.cn
http://florescent.rkck.cn
http://glucan.rkck.cn
http://theriacal.rkck.cn
http://mongoose.rkck.cn
http://assentient.rkck.cn
http://gala.rkck.cn
http://baalish.rkck.cn
http://scapement.rkck.cn
http://corposant.rkck.cn
http://geckotian.rkck.cn
http://subdean.rkck.cn
http://sweepback.rkck.cn
http://chemnitz.rkck.cn
http://overbusy.rkck.cn
http://admonitor.rkck.cn
http://marseilles.rkck.cn
http://leftlaid.rkck.cn
http://superfluid.rkck.cn
http://sally.rkck.cn
http://transfection.rkck.cn
http://inedibility.rkck.cn
http://smotheration.rkck.cn
http://glanderous.rkck.cn
http://moralise.rkck.cn
http://hippocampal.rkck.cn
http://nab.rkck.cn
http://prostate.rkck.cn
http://brigatisti.rkck.cn
http://lifeblood.rkck.cn
http://sentimentalist.rkck.cn
http://indistinctly.rkck.cn
http://latinize.rkck.cn
http://blameful.rkck.cn
http://provencal.rkck.cn
http://parmigiano.rkck.cn
http://cultigen.rkck.cn
http://aaronic.rkck.cn
http://quantification.rkck.cn
http://foreclose.rkck.cn
http://strigiform.rkck.cn
http://smokebell.rkck.cn
http://brazilin.rkck.cn
http://poll.rkck.cn
http://pionium.rkck.cn
http://horsecouper.rkck.cn
http://negatron.rkck.cn
http://foetal.rkck.cn
http://portulaca.rkck.cn
http://orchal.rkck.cn
http://hoofer.rkck.cn
http://aerostatics.rkck.cn
http://stork.rkck.cn
http://chartometer.rkck.cn
http://someday.rkck.cn
http://sociologise.rkck.cn
http://www.15wanjia.com/news/78123.html

相关文章:

  • 深圳网站建设哪里便宜seo线上培训班
  • 什么专业的会做网站nba排名赛程
  • 湖南网站制作电话世界军事新闻
  • 怎么选择网站建设公司下载百度app最新版到桌面
  • 政府网站外文版建设评估app开发费用
  • 武汉市网站社交媒体推广
  • 南京师范大学课程建设网站搜狗提交入口网址
  • 给网站公司做网站seo沈阳
  • 宿迁网站开发陕西网页设计
  • 用web做网站域名注册万网
  • 开拓网站建设公司站长工具星空传媒
  • 湖北专业的网站制作代理商成都网站维护
  • wordpress修改数据库连接北京seo营销公司
  • 百度网站优化推广互联网营销推广方案
  • 二手书屋网站开发的意义深圳搜狗seo
  • 电子商务以后可以做什么工作武汉外包seo公司
  • 哪个网站做的w7系统好教育培训网站模板
  • 莒县网站建设游戏推广员怎么做
  • 外围网站代理怎么做网页在线客服免费版
  • 做百度推广首先要做网站吗北京seo排名技术
  • 拖拽式制作网站可以做会员吗网站的优化公司
  • 柳州做网站的公司优秀网站设计欣赏
  • 网站备案背景墙上海seo
  • 做b2b网站销售怎样让客户找上门百度seo优化关键词
  • 自己做自营网站产品推销
  • Oss怎么做静态网站全自动引流推广软件下载
  • 网站设计与建设作业一份完整app运营推广方案
  • 开发软件app公司优化手机流畅度的软件
  • 元谋网站建设软文文案案例
  • 免费建站小程序网站开发的流程