python学习笔记--类与模块

python学习笔记--类与模块

ID:10784176

大小:26.94 KB

页数:10页

时间:2018-07-08

python学习笔记--类与模块_第1页
python学习笔记--类与模块_第2页
python学习笔记--类与模块_第3页
python学习笔记--类与模块_第4页
python学习笔记--类与模块_第5页
资源描述:

《python学习笔记--类与模块》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、类(New-Style-Class):名字空间:>>>classUser(object):pass>>>u=User()>>>type(u)>>>u.__class__1、类型(class)存储了所有的静态字段和⽅法(包括实例⽅法),而实例(instance)仅存储实例字段,从基类object开始,所有继承层次上的实例字段。官⽅文档将所有成员统称为Attribute。2、类型和实例各自拥有⾃己的名字空间。3、访问对象成员时,就

2、从这几个名字空间中查找,⽽非以往的globals、locals。成员查找顺序:instance.__dict__->class.__dict__->baseclass.__dict__注意分清对象成员和普通名字的差别。就算在对象⽅法中,普通名字依然遵循LEGB(local,enclosing,global,builtin)规则。字段Field:•实例字段存储在instance.__dict__,代表单个对象实体的状态。•静态字段存储在class.__dict__,为所有同类型实例共享。•必须通过类型和实例对象才能

3、访问字段。•以双下划线开头的class和instance成员视为私有,会被重命名。(module成员不变)1、可以在任何时候添加实例字段,仅影响该实例名字空间,与其他同类型实例⽆关。2、要访问静态字段,除了class.外,也可以⽤instance.。按照成员查找规则,只要没有同名的实例成员,那么就继续查找class.__dict__。3、私有字段以双下划线开头,⽆论是静态还是实例成员,都会被重命名:___。4、某些时候,我们既想使用私有字段,又不想放弃外部访问权限

4、。•用重命名后的格式访问。•只⽤一个下划线,仅提醒,不重命名。属性Property:1、属性方法多半都很简单,⽤lambda实现会更加简洁。鉴于lambda函数不能使⽤赋值语句,故改用setattr。还得注意别⽤会被重命名的私有字段名做参数。2、属性总是比同名实例字段优先,尽可能用属性,而不是直接暴露内部字段。方法:1、实例⽅法和函数的最⼤区别是self这个隐式参数。2、在⽅法里访问对象成员时,必须使⽤对象实例引用。否则会当做普通名字,依照LEGB规则查找。3、个特殊的可选⽅法:•__new__:创建对象实例。构

5、造⽅法__new__可返回任意类型,但不同的类型会导致__init__⽅法不被调用。•__init__:初始化对象状态。•__del__:对象回收前被调用。继承:1、除了所有基类的实例字段都存储在instance.__dict__外,其他成员依然是各归各家。2、如果派⽣类不提供初始化⽅法,则默认会查找并使用基类的⽅法。基类引用存储在__base__,直接派⽣类存储在__subclasses__。3、可以用issubclass()判断是否继承⾃某个类型,或用isinstance()判断实例对象的基类。4、成员查找规

6、则允许我们⽤实例引用基类所有成员,包括实例⽅法、静态⽅法、静态字段。但这⾥有个坑:如果派生类有一个与基类实例⽅法同名的静态成员,那么首先被找到的是该静态成员,⽽不是基类的实例⽅法了。因为派生类的名字空间优先于基类。故此,可以在派生类中创建一个同名实例方法,就可实现“覆盖(override)”。5、多重继承成员搜索顺序,也就是mro(methodresolutionorder)要稍微复杂⼀点。归纳⼀下就是:从下到上(深度优先,从派⽣类到基类),从左到右(基类声明顺序)。mro和成员查找规则是有区别的,__mro__

7、列表中并没有instance。在多重继承中使用supper会引发一些问题,复杂化,建议改用组合模式实现类似的功能。6、__bases__类型对象有两个相似的成员:__base__:只读,总是返回__bases__[0]。__bases__:基类列表,可直接修改来更换基类,影响mro顺序。7、抽象类:无法实例化。如果派⽣类也是抽象类型,那么可以部分实现或完全不实现基类抽象成员。派⽣类Manager也是抽象类,它实现了部分基类的抽象成员,⼜增加了新的抽象成员。这种做法在面向对象模式⾥很常见,只须保证整个继承体系⾛下来

8、,所有层次的抽象成员都被实现即可。8、开发类:在运行期也可以随意的改动对象,增加删除成员。增加成员时需要明确放在哪。将实例方法放到instance.__dict__是没效果的。因为不是boundmethod,所以必须显式传递对象引用。正确的做法是放到class.__dict__。静态⽅法必须⽤装饰器staticmethod、classmethod包装⼀下,否则会被当做实例

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。