网站大量收购独家精品文档,联系QQ:2885784924

python学习笔记--类与模块.docxVIP

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
python学习笔记--类与模块

类(New-Style-Class):名字空间: class User(object): pass u = User() type(u)class __main__.User u.__class__class __main__.User1、类型 (class) 存储了所有的静态字段和?法 (包括实例?法),而实例 (instance) 仅存储实例字段,从基类 object 开始,所有继承层次上的实例字段。官?文档将所有成员统称为 Attribute。2、类型和实例各自拥有?己的名字空间。3、访问对象成员时,就从这几个名字空间中查找,?非以往的 globals、locals。成员查找顺序: instance.__dict__ - class.__dict__ - baseclass.__dict__注意分清对象成员和普通名字的差别。就算在对象?法中,普通名字依然遵循 LEGB (local,enclosing,global,builtin)规则。字段Field:? 实例字段存储在 instance.__dict__,代表单个对象实体的状态。? 静态字段存储在 class.__dict__,为所有同类型实例共享。? 必须通过类型和实例对象才能访问字段。? 以双下划线开头的 class 和 instance 成员视为私有,会被重命名。(module 成员不变)1、可以在任何时候添加实例字段,仅影响该实例名字空间,与其他同类型实例?关。2、要访问静态字段,除了 class.name 外,也可以? instance.name。按照成员查找规则,只要没有同名的实例成员,那么就继续查找 class.__dict__。3、私有字段以双下划线开头,?论是静态还是实例成员,都会被重命名: _class__name。4、某些时候,我们既想使用私有字段,又不想放弃外部访问权限。? 用重命名后的格式访问。? 只?一个下划线,仅提醒,不重命名。属性Property:1、属性方法多半都很简单,? lambda 实现会更加简洁。鉴于 lambda 函数不能使?赋值语句,故改用 setattr。还得注意别?会被重命名的私有字段名做参数。2、属性总是比同名实例字段优先,尽可能用属性,而不是直接暴露内部字段。方法:1、实例?法和函数的最?区别是 self 这个隐式参数。2、在?法里访问对象成员时,必须使?对象实例引用。否则会当做普通名字,依照 LEGB 规则查找。3、个特殊的可选?法:? __new__: 创建对象实例。构造?法 __new__ 可返回任意类型,但不同的类型会导致 __init__ ?法不被调用。? __init__: 初始化对象状态。? __del__: 对象回收前被调用。继承:1、除了所有基类的实例字段都存储在 instance.__dict__ 外,其他成员依然是各归各家。2、如果派?类不提供初始化?法,则默认会查找并使用基类的?法。基类引用存储在 __base__,直接派?类存储在 __subclasses__。3、可以用 issubclass() 判断是否继承?某个类型,或用 isinstance() 判断实例对象的基类。4、成员查找规则允许我们?实例引用基类所有成员,包括实例?法、静态?法、静态字段。 但这?有个坑:如果派生类有一个与基类实例?法同名的静态成员,那么首先被找到的是该静态成员,?不是基类的实例?法了。因为派生类的名字空间优先于基类。故此,可以在派生类中创建一个同名实例方法,就可实现“覆盖(override)”。5、多重继承成员有哪些信誉好的足球投注网站顺序,也就是 mro (method resolution order) 要稍微复杂?点。归纳?下就是:从下到上 (深度优先,从派?类到基类),从左到右 (基类声明顺序)。mro 和成员查找规则是有区别的,__mro__ 列表中并没有 instance。在多重继承中使用supper会引发一些问题,复杂化,建议改用组合模式实现类似的功能。6、__bases__类型对象有两个相似的成员: __base__: 只读,总是返回 __bases__[0]。__bases__: 基类列表,可直接修改来更换基类,影响 mro 顺序。7、抽象类:无法实例化。如果派?类也是抽象类型,那么可以部分实现或完全不实现基类抽象成员。派?类 Manager 也是抽象类,它实现了部分基类的抽象成员,?增加了新的抽象成员。这种做法在面向对象模式?很常见,只须保证整个继承体系?下来,所有层次的抽象成员都被实现即可。8、开发类:在运行期也可以随意的改动对象,增加删除成员。增加成员时需要明确放在哪。将实例方法放到 instance.__dict__ 是没效果的。因为不是 bound method,所以必须显式传递对象引用。正确的做法是

文档评论(0)

2017ll + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档