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

精能集团有限公司两学一做网站东莞报告1例

精能集团有限公司两学一做网站,东莞报告1例,山西网站设计,织梦免费购物网站任务 想确保所有的超类的__init__方法被自动调用(如果该超类定义过__init__方法)但 Python 并不会自动调用此方法。 解决方案 如果你的类是新风格类,内建的 super 会使这个任务变得极其简单(如果所有的超类的__init__方法也用相似的方式使用 super): class News…

任务

想确保所有的超类的__init__方法被自动调用(如果该超类定义过__init__方法)但 Python 并不会自动调用此方法。

解决方案

如果你的类是新风格类,内建的 super 会使这个任务变得极其简单(如果所有的超类的__init__方法也用相似的方式使用 super):

class NewstyleOnly(A,B,C):def __init__(self):super(NewStyleOnly,self).__init__()initialization specific to subclass NewstyleOnly

讨论

对新的开发任务,经典类不太值得推荐:它们的存在只是为了保证对于老版本Python的向后兼容性。应当尽量使用新风格类(直接或间接从object派生)。在新风格类中唯一你不能做的事情是将它的实例当做异常对象抛出,异常对象必须是旧风格的,不过对这些类你并不需要使用本节提供的功能。因此,下面将要进行的讨论会比较深入同时适用面也更窄,你如果不感兴趣的话可以直接略过。

你可能需要在经典类中使用这个功能,或者,你也想在新风格类中使用这个功能,但是这个类的某些超类并不满足前面提到的条件,即以正确的方式调用内建函数 super。针对这些情况,首先你要做的是前期准备工作——将所有的类转变为新风格类并且使它们正确地调用 super。如果你确实无法完成准备工作,那么你能做的就是循环检查基类–对每个基类,都看它是否拥有__init__,如果有的话,调用该方法:

class LookBeforeYouLeap(X,Y,Z):def __init__(self):for base in self__class__.__bases__:if hasattr(base,'__init__'):base.__init__(self)initialization specific to subclass lookBeforeYouLeap

更一般的,并不仅限于__init__ 方法,我们常常需要调用一个实例或者类的其他方法如果这个方法存在的话;如果实例或类的此方法不存在,我们就什么也不做,或者只做默认的动作。解决方案中展示的基于内建的 super 技术并不具有通用性:它只适用于当前对象的超类,要求那些超类以正确的方式调用 super,还要求被调用的方法在那些超类中存在。不过,所有的新风格类都拥有__init__方法:它们都是object的子类,而object定义了__init__(默认什么也不做,接受并忽略任何参数)。因此,所有的新风格类都拥有__init__方法,无论是继承来的还是重载过的。

在 LookBeforeYouLeap 类中展示的 LBYL, 技术具有更宽广的应用面,它可被用于包括__init__ 在内的各种方法。LBYL还可以和 super 合用,如下面这个例子所示:

class Base1(object):def met(self):print 'met in Base1'
class Der1(Base1):def met(self):s = super(Der1,self)if hasattr(s,'met'):s.met()print 'met in Der1'
class Base2(object):Pass
class Der2(Base2):def met(self):s = super(Der2,self)if hasattr(s,'met'):s.met()print 'met in Der2'
Der1().met()
Der2().met()

这个片段的输出是:

met in Base1
met in Derl
met in Der2

met 的实现对于所有的派生类,包括Der1(超类是 Base1,超类有 met 方法)和 Der2(超类是 Base2,超类没有这个方法),都具有相同的结构。通过将局部名字s绑定到super 的结果,并在调用方法之前先用 hasattr 检查超类是否拥有这个方法,这个LBYL结构使得可以用相似的代码处理两种情况。当然,在编写子类的时候,你通常就已经知道了超类有哪些方法以及是否需要和怎样调用它们。有时,当需要子类略微偏离它的超类的时候,这种技术能够提供一些额外的灵活度。

不过 LBYL 技术还远远谈不上完美:超类可能定义一个属性名为 met,这个 met 不能被调用也不需要参数。如果你确实非常需要灵活性,必须排除这种情况,可以获取超类的方法对象(如果有的话),然后用标准库模块inspect提供的getargspec函数来检查。但是当试图将这个概念推及到一般的情况下,复杂性就增加了。下面是一个例子,这个类的方法会试图不用参数调用超类中同名的方法(如果在超类中该属性存在而且可调用):

import inspect
class Der(A,B,C,D):def met(self):s = super(Der,self)#获取超类的被绑定对象,如果没有的话返回Nonem = getattr(s,'met',None)try:args,varargs,varkw,defaults = inspect.getargspec(m)except TypeError:#m不是方法,忽略passelse:#m是方法,它的所有参数都有默认值吗?if len(defaults) == len(args):#是的,调用之:m()print 'met in Der'

如果传递给 inspect.getargspec 的参数不是方法或函数,它会抛出一个TypeError 的异常这样我们就可以通过 try/except声明发现这种情况,如果确实有异常发生,我们只需在except子句中放入一个什么也不做的pass声明将其忽略即可。为了简化代码,我们并没有首先用hasattr 进行检查工作,而是用带有第三个参数的getattr 来获取“met”属性。因此,如果超类并没有任何一个叫做“met”的属性,m 会被设置成None,如果我们用 None 作为inspect.getargspec 的参数,同样会引发TypeError 异常——这样起到了一石二鸟的作用。如果在 ty子句中对inspect.getargspec 的调用没有引发 TypeError 异常,程序会继续执行 else 子句。

如果inspect.getargspec没有抛出TypeError,它会返回一个含有四个子项的元组,我们可以将各项绑定到一个本地名。在这里,我们关心的是 args,它是m的参数名列表,以及 defaults,一个 m 为它的参数提供的默认值元组。很显然,当且仅当 m 为它的参数提供了默认值时,我们才可以不使用参数调用 m。因此,通过比较args 列表和 defaults元组的长度,我们可以知道默认值的数目是否和参数的数目一致,只要两者一致我们就可以调用 m。

很显然,在大多数的情况下没必要使用这种高级的内省技术并进行细致地检查,但如果你确实需要这种能力,Python 提供了所有需要的技术。

http://www.dtcms.com/wzjs/557971.html

相关文章:

  • 服务器php网站打不开汕头网站建设公司哪个好
  • 成都中小企业申请网站想自己做一个网站应该怎么弄
  • 做网站的主题有哪些做网站软件
  • 关于做营销型网站的建议seo网络推广技术员招聘
  • 北京高档网站建设网站开发文档撰写作业
  • 手机端网站关键字排名电子网站设计
  • 网站开发电话话术网站打开慢原因
  • 苏州建站模板系统北京做网站建设的公司排名
  • 长沙住房和建设局网站西安百度推广优化公司
  • 网站怎么做地区屏蔽jswordpress获取网址
  • 域名还没备案可以做网站吗昌平手机网站建设
  • 做网站永久怎么样做移动油光文字网站
  • 电子商务网站模板页面白云区建设局网站
  • 一般做网站都在什么网做企业进行网络营销策划的目标
  • 江门专业网站建设报价seo优化必备技巧
  • php网站接入支付宝wordpress头像函数
  • 火币网站怎么做空手机维修网站模板
  • 婚纱摄影网站的设计思路建设网站的网站底压电工证
  • 网站模板登录模块杭州网站建设 博客
  • 网站类别选择吴川网站建设
  • 永嘉县建设局网站中国交建平台
  • 网站维护和推广方案网页编辑可视化软件
  • 苏州园区做网站公司常用设计资源网站
  • 义乌建设公司网站阿里云 wordpress 响应时间
  • 自动成交型网站建设金融网站建设多少钱
  • 网站建设事宜合肥网络公司排行榜
  • 青岛网站推广途径网站设计计划书模板
  • 建设部网站 测绘规章怎样做外贸网站建设
  • 域名解析 网站宁波网站建设公司哪家比较好
  • 网站建社石家庄中山 网站建设一条龙