Python面向对象编程(OOP)
一、面向对象过程的优点特征:
封装
1 模型的特征和能力打包在一起 2 模型的改变由模型自身完成 3 隐藏模型的细节,外界只能使用,不能改变
继承
1 符合自然界分类规律 2 快速实现代码重用 3 符合现实世界中事物的特征
多态
1 子类可以继承父类的特征与能力 2 还可以通过自定义来修改其特征与能力 3 鸭子模型: 4 只要具有使用者的属性或能力便可以使用 5 |==>其他语言需要通过接口来实现 6 不同类,相同方法 7 相同类,不同方法
组合
1 一个模型可以由其他模型组成
二、类的具体实现和特征
1、类的定义
1 class TextClass: 2 pass
在python3中默认继承object父类
#python2默认为经典类,显式引用object类为新式类
#python3默认为新式类,不用显式引用object类
!!!!!
经典类继承为深度优先
新式类继承为广度优先
2、类的特征,能力,描述
【1】能力==>体现在方法上,类具有能动性
【2】特征属性,是具有自身包含或知道的模型
3、类的实例化
1 前面定义了TestClass类 2 接下来实例化 3 A=TestClass()
【1】与类的关系:定义类就是建立模型(就像是印章,模子)
实例就是产生真实的模型产品(产品)
【2】实例化步骤
(1)‘__new__()'方法创建实例
自动从object继承
(2)’__init__()'方法初始化实例
若是定义了,则从定义的'__init__'开始使用定义了的(就是方法的重载)
若是没有定义,则使用继承自object类的‘__init__'方法
4、添加类的说明
在类名的下一行用三引号标出
“”“
docstring
”“”
这就是类的说明文档
类的文档查看:
>>>help(A)
#A为要查看的类名
>>>A.__doc__
5、类的特征描述
【1】实例属性
类被实例化才具有的属性
一般在'__init__'()方法中创立并实例化
直接使用即定义:self.<属性名>
<1>在类内定义属性(定义类的时候)
<2>在类外定义属性(在实例化以后)
!注意:相同类的不同实例具有不同的属性值
备注:一般不建议在__init__()方法外定义,创建和初始化实例,
一般不推荐类外定义和修改,修改可以单独定义方法
【2】类属性
类属性使得相同类的不同实例具有相同的变量
>>引用方法:类名.属性
【3】类的私有属性
‘__'开头的变量名加以标志,只有类对象自己能访问。(内部实现时会自动改变变量名)
’__init__()' 初始化类的方法 ’__doc__' 类的说明文档
‘__dict__' 实例属性和值 ’__module__' 类所在的模块
‘__base__' 父类
【4】深入类的属性
同名的类属性与实例属性,
1)以<类名>.属性名 引用时只能引用类属性
2)以<实例名>.属性名 引用时只能引用实例属性
1 In [54]: class text: 2 ...: a=4 3 ...: def __init__(self,b=4): 4 ...: self.b=b 5 ...: 6 7 In [55]: c=text() 8 9 In [56]: c.a 10 Out[56]: 4 11 12 In [57]: c.b 13 Out[57]: 4 14 15 In [58]: text.a 16 Out[58]: 4 17 18 In [59]: text.b 19 --------------------------------------------------------------------------- 20 AttributeError Traceback (most recent call last) 21 <ipython-input-59-cc1e79bff36f> in <module>() 22 ----> 1 text.b 23 24 AttributeError: type object 'text' has no attribute 'b'
【5】属性访问的特殊方法(反射)
工具函数:1)hasatter(obj_name,"属性名") 测试是否具有类的属性
2)setattr(obj_name,"属性名") 设置属性
3)getattr(obj_name,"属性名" 取属性
【6】属性的包装
将方法包装成属性,以隐藏相关实现:1)控制属性的类型和范围 2)虚拟属性由其他属性处理后得来
三种属性包装操作:
1)@property 可读
2)@<property-name>.setter 可写
3)@<property-name>.delter 可删
下两个必须有第一个包装
包装产生虚拟包装
【7】描述符
用来拦截和控制属性访问并可以重复使用
将实现特殊协议方法额类
1 协议方法: 2 __get__( ) 3 __set__( ) 4 __delete__( ) 5 分类: 6 数据描述符(实现全部协的名法了 7 非数据描述符( 实现部各十协议方法) 8 说明: 所有关成员正数都是非海据描达符 9 描述符必须作为另一个类的类属性, 10 11 同名的实创剧性和非数推描述条(以方法为例 12 优先级 13 def pr(): 14 print('..............') 15 >>>t.pr=10 16 >>>t.pr 17 >>>10 18 >>>del t.pr 19 >>>t.pr 20 21 22 注意,只能在新成类中使用 23 _call__()让类的实例如函数一样可调用 24 类的继承与重载 25 继承的特点: 26 减少代码和灵话定到新类 27 子类具有父类的属性和方法 28 子类不能细继承父类的手有剧性3 法 29 子类可以添加后的方说 30 子类可以修改又类的乡法
6、类的方法
【1】类方法定义
类似面向过程中的函数定义方法
第一个参数总是self
1 def Foo(self,a): 2 self.a=a 3 print(self.a)
【2】类方法的调用
<1>类的内部调用:self.<方法名>(参数列表)
<2>类的外部调用:<实例名>.<方法名>(参数列表)
【3】构造方法 ’__init__()' 初始化实例
实例化步骤:1、‘__new__()' 定义新的实例 2、’__init__' 初始化实例
>>>>>>>>>>>>>>未完待续2018-03-04<<<<<<<<<<<<<<<
>>>>>>>>>>>>> 更新2018-03-08<<<<<<<<<<<<<<<<<<<<
【4】类的特殊方法
类也是一个对象,但是具有创建其自身实例的能力
类可以把它作为函数的参数传送
【5】元类:类的创建和管理者
所有的类都是元类(type)的实例
>>>Test = type("Test",(),{'age':13,'name':"wangbo"})
【6】自定义元类
目的:对其创造的类进行预处理
继承type类
步骤:1)定义‘__init__'方法
在使用自定义元类的时候:__metaclass__ =Myclass #指定元类
所有定义的为Myclass元类的子类
【7】类的特殊方法
构造序列:
__len__ __getitem__(self,key) __setitem__(self,key,value) __delitem__(self,key)
构造迭代器
__iter__(self) 定义迭代方式 __next__(self)