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

济南做网站优化的公司江阴网站优化公司

济南做网站优化的公司,江阴网站优化公司,wordpress 商品页面,和wordpress类似的源码学好和用好python#xff0c; descriptor是必须跨越过去的一个点#xff0c;现在虽然Python书籍花样百出#xff0c;但是似乎都是在介绍一些Python库而已#xff0c;对Python语言本身的关注很少#xff0c;或者即使关注了#xff0c;但是能够介绍把 dscriptor介绍清楚的 descriptor是必须跨越过去的一个点现在虽然Python书籍花样百出但是似乎都是在介绍一些Python库而已对Python语言本身的关注很少或者即使关注了但是能够介绍把 dscriptor介绍清楚的是很少的到目前我自己还没有见到过。 一个attr能被称为descriptor除了需要定义 descriptor protocol 规定的方法外这个attr必须是属于某个class的不能是属于某个instance 一、Python中的descriptor   在一个Python class 中重写下面任何一个方法都称为descriptor     1.__get__(self,obj,typeNone)----value     2.__set__(self,obj,value)----None     3.__delete__(self,obj)----None   descriptor细分:      1.Data descriptor :      只是重写__get__,__set__的class      2.None Data descriptor:    只是重写了__get__的class      3.read-only Data descriptor     同时定义了__get__,__set__但是这个__set__只是raise AttributeError   Data descriptor和None Data descriptor 的区别:相对于 instance 字典的优先级。             若实例字典中有与描述器同名的属性若描述器为资料描述器则优先访问资料描述器;若描述器为非资料描述器            则优先使用字典中的属性。这条规则在实际应用中的例子如果实例中有方法和属性重名时Python会优先使用实例字典中的属性            因为实例函数的实现是个非资料描述器。   二、通过instance访问属性:   1.获取attr   instance.a __getattribute__,__getattr__,__get__和__dict__都与属性访问有关它们的优先级: 1.当类中( type(instance) )定义了__getattribute__方法时无条件的调用__getattribute__.所以在__getattribute__方法中不能出现self.__attr__这种调用它会引起无限制递归 2.如果访问的attr存在并且这个attr是属于 type(instance)的或者属于type(instace) 的某个父类(是super class 不是metaclass)的并且这个attr是一个descriptor那么此时会转而继续调用都相应 class.__get__。 简而言之:   2.1 这个attr是个Descriptor是调用这个属性的__get__ 2.2这个attr不是一个Descriptor,就调用__dict__[attr] 3.如果类中没有定义该属性则调用__getattr__ 4.否则抛出异常AttributeError   实验一 : 在self.__dict__可以获得某个遵守了descriptor的attr这个attr不是一个descriptor,所以不遵守descriptor规则 class DataDescriptor(object):def __get__(self,obj,owner):print(datadescriptor.__get__ ,self,obj,owner)return 2class A(object):passclass B(A):def __init__(self):self.datadescriptorDataDescriptor()aB() print a.datadescriptor #输出__main__.DataDescriptor object at 0x00BD8DB0实验二:在class.__dict__中得到attr并且这个attr是一个descriptor class DataDescriptor(object):def __get__(self,obj,owner):print(datadescriptor.__get__ ,self,obj,owner)return 2class A(object):datadescriptorDataDescriptor()class B(A):def __init__(self):passaB() print a.datadescriptor输出 (datadescriptor.__get__ , __main__.DataDescriptor object at 0x00BD8CF0, __main__.B object at 0x00BD8D50,class __main__.B)实验三:__getattribute__返回非descriptor  class DataDescriptor(object):def __get__(self,obj,owner):print(DataDescriptor.__get__ ,self,obj,owner)return 2class A(object):datadescriptorDataDescriptor()class B(A):def __init__(self):passdef __getattribute__(self,name):print(B.__getattribute__ name,name)return abcaB() print a.datadescriptor输出(B.__getattribute__ name, datadescriptor) abc实验四 __getattribute__返回descriptor,遵守descriptor规则 def __get__(self,obj,owner):print(DataDescriptor.__get__ ,self,obj,owner)return 2class A(object):datadescriptorDataDescriptor()class B(A):def __init__(self):passdef __getattribute__(self,name):print(B.__getattribute__ name,name)return type(self).datadescriptoraB() print a.datadescriptor 输出 (B.__getattribute__ name, datadescriptor) (DataDescriptor.__get__ , __main__.DataDescriptor object at 0x00BD8CB0, None, class __main__.B) 2实验五在找不到attr的情况下这种情况比较特殊在__getattribute__中return None 或者 没有return 语句都不会调用只有 在__getattribute__中 raise AttributeError(),才会调用 __getattr__,如果没有定义__getattribute__ 在找不到attribute的情况下VM默认是会raise AttributeError()的.  代码1 class DataDescriptor(object):def __get__(self,obj,owner):print(DataDescriptor.__get__ ,self,obj,owner)return 2class A(object):datadescriptorDataDescriptor()class B(A):def __init__(self):passdef __getattribute__(self,name):print(B.__getattribute__ name,name)raise AttributeError()#return Nonedef __getattr__(self,name):print(B.__getattr__ name,name)return Not FoundaB() print a.datadescriptor定义了__getattribute__但是 raise AttributeError了所以会转而继续调用到__getattr__,没有没有 raise AttributeError无论__getattribute__中做了什么都不会继续调用__getattr__代码2 class DataDescriptor(object):def __get__(self,obj,owner):print(DataDescriptor.__get__ ,self,obj,owner)return 2class A(object):datadescriptorDataDescriptor()class B(A):def __init__(self):pass#def __getattribute__(self,name):# print(B.__getattribute__ name,name)# raise AttributeError()#return Nonedef __getattr__(self,name):print(B.__getattr__ name,name)return Not FoundaB() print a.zz找不到zz 这个attr,vm默认会 raise AttributeError自动转而调用__getattr__2.设置instance.attr    设置instance.attrvalue时涉及到三个方法分别为__setattr__、__set__和__dict__[attr]val没有__setattribute__     调用的优先级为   1.如果type(instance) 中定义了__setattr__方法就直接调用这个方法。   2.如果这个attr是个descriptor,那会分情况     2.1如果是个data descriptor定义了 __set__方法,那么会调用 data descriptor的__set__方法     2.2如果是个None data descriptor没有定义__set__方法那么会是instance.__dict__[attr]value   3.如果attr不是descriptor,会直接instance.__dict__[attr]value    实验一:None data descriptor时的设置    # -*- coding:utf-8 -*- class DataDescriptor(object):def __init__(self):self.values{};def __get__(self,obj,owner):print(DataDescriptor.__get__ ,self,obj,owner)return self.valuesclass A(object):datadescriptorDataDescriptor()class B(A):def __init__(self):passaB() a.datadescriptor999 print a.__dict__ 输出: {datadescriptor: 999}实验二:Data descriptor时的set attr # -*- coding:utf-8 -*- class DataDescriptor(object):def __init__(self):self.values{};def __get__(self,obj,owner):print(DataDescriptor.__get__ ,self,obj,owner)return self.valuesdef __set__(self,instance,value):print(DataDescriptor.__set__ ,instance,value)class A(object):datadescriptorDataDescriptor()class B(A):def __init__(self):passaB() a.datadescriptor999 print a.__dict__ 输出: (DataDescriptor.__set__ , __main__.B object at 0x00BD8E30, 999) {}可以看出在data descriptor时设置相应的data descriptor attribute时没有影响到instance.__dict__   实验三type(instance)有定义__setattr__方法时    # -*- coding:utf-8 -*- class DataDescriptor(object):def __init__(self):self.values{};def __get__(self,obj,owner):print(DataDescriptor.__get__ ,self,obj,owner)return self.valuesdef __set__(self,instance,value):print(DataDescriptor.__set__ ,instance,value)class A(object):datadescriptorDataDescriptor()class B(A):def __init__(self):passdef __setattr__(self,key,value):print(B.__setattr__ ,key,value)self.__dict__[key]valueaB() a.datadescriptor999 print a.__dict__ 输出: (B.__setattr__ , datadescriptor, 999) {datadescriptor: 999}当type(instance)有定义__setattr__方法时那么是否是 descriptor就无关紧要了都会调用这个__setattr__      2删除instance.attr    删除instance.attr和设置instacne.attr的情况非常类似涉及到三个方法或情况:__delattr__或__delete__ , 删除 instance.__dict__   优先级也是和设置instance.attr一样的     1.如果type(instance)定义了__delattr__,那么直接调用无论这个attr是否为descriptor     2.如果没有定义__delattr__并且是descriptor         2.1,如果这个descriptor 定义了 __delete__,那么调用__delete__方法         2.2如果这个descriptor 没有定义__delete__,那么raise AttributeError     3.del intance.__dict__[attr]   三、通过class访问属性 通过class object来获取attr在概念上其实和通过instance来获取属性是一样的instance 的class 是某个class object,而 class object 的class 应该是这个class的 metaclass 当在class object 的dict中找不到attr时会转而向 class 的metaclass的dict中去寻找. 通过ClassA.attr访问属性的规则为 如果MetaClass中有__getattribute__则直接返回该__getattribute__的结果。如果attr是个Descriptor则直接返回Descriptor的__get__的结果。如果attr是class.dict中的属性则直接返回attr的值如果类中没有attr且MetaClass中定义了__getattr__则调用MetaClass中的__getattr__如果类中没有attr且MetaClass中没有定义__getattr__则抛出异常AttributeError 实验 class Metaclass(type):datadescriptorDataDescriptor()def __new__(metaclz,name,bases,attrs):print(create new class ,metaclz,name)return type.__new__(metaclz, name, bases, attrs)def __getattr__(self,name):print(Metaclass.__getattr__ name:,name)#def __getattribute__(self,name):# print(Metaclass.__getattribute__ name:,name)# return nameaclass classB(object):__metaclass__Metaclassprint classB.datadescriptorprint classB.ss输出(create new class , class __main__.Metaclass, classB) (DataDescriptor.__get__ , __main__.DataDescriptor object at 0x00BD8EF0, class __main__.classB, class __main__.Metaclass) 2 (Metaclass.__getattr__ name:, ss) None其实可以发现descriptor的主要作用是起到了保护作用当某种类型的变量被访问的时候在给一次程序员一个控制的机会。 另外__getattr__也有类似的作用__getattr__的用法有很多典型的是在 web程序中经常要有request.attr 、request[attr]这种操作那么这个时候把本需要用函数(类似 request.get(name) )来获取某些状态变量的操作转成 request.attr 、request[attr]这种形式方便很多。   转载于:https://www.cnblogs.com/hi0xcc/p/5586601.html
http://www.pierceye.com/news/346840/

相关文章:

  • 网站建设公司地址在哪济南网站建站公司
  • 图片瀑布流网站模板哪里有html5网站建设
  • 做韩国网站可以做推广的网站有哪些
  • 阳泉哪里做网站传统企业如何做好网络推广
  • 做网站不赚钱潍坊制作网站的公司
  • 网站城市切换代码手机微信官方网站
  • 福州建设招聘信息网站动漫设计专业哪个学校比较好
  • 网站建设需要哪些准备wordpress调用单页面跳转
  • 小公司使用的网站开发电子商务毕业设计 网站建设
  • 简单的个人网站模板网站建设费记什么科目
  • 中国建设银行宁波分行网站一般网站空间要多大
  • 做简单视频网站自己看廊坊专门做网站
  • 做贸易网站科技型中小企业服务平台登录
  • 网站怎么接广告赚钱net创建网站之后怎么做
  • 做网站如何让盈利wordpress链接样式表
  • 网站建设与管理计划谷歌浏览器官网下载手机版
  • 做请帖的网站上海阳性增多
  • 有回定ip怎么做网站青岛建设集团招聘信息网站
  • 淘宝内部卷网站怎么做智慧团建网站登录忘记密码
  • 网站建设前十名建站系统cms
  • 第三方网站开发的商家厦门广告公司网站建设
  • 网站建设基础条件临猗网站制作
  • 建设博客网站步骤常州网站建设百科
  • 门户网站 管理系统wordpress 微信图标
  • 广元网站建设广元莱芜论坛二手车
  • 山东省建设工程质量监督网站广州软件合作中心
  • 郑州网站建设怎么样通州建设局网站
  • 免费网站建设福州怎么修改网站主页
  • 深圳企业建站设计公司wordpress不显示样式
  • 外贸网站商城广东省建设协会网站