Python核心编程(第十三章)--面向对象编程
2016-06-02 15:43
316 查看
面向对象编程主要是类和类的实例
创建类:
关键词是class,紧接着是一个类名,随后是定义类的类体代码
object是所有类之母,如果你所写的类没有继承其他任何父类,object将作为默认父类。它位于所有类继承结构的最上层。
创建一个实例的过程称为实例化:
myFirstObject = MyNewObjectType()
类的功能即方法
所有的方法声明中都有self参数,这个参数代表实例对象本身,当用实例调用方法时,不需要传递self,他是自动传入的
如果有两个参数,调用只需要传递第二个参数就好
__init__()是一个特殊的方法,当Python创建失利后,在实例化过程中调用__init__()方法
创建子类:
继承的子类将保持已存在类所有特性
类的创建:
简单的类的生声明可以是关键字后紧跟类名
在Python中定义紧跟着声明,并且同时所有的方法也必须同时被定义
类属性:
想知道一个类有哪些属性有两种方法:
1)使用内建函数dir(),返回的是对象属性的一个名字列表
2)访问类的字典属性__dict__,返回的是一个字典,键是属性名,键值是相应属性对象的数据值
特殊类:
__init__()是在解释器为你创建一个实例后调用的第一个方法
__new__()构造器方法:它作用在构造方法建造实例之前,在__init__()启动之前,__new__()决定是否要使用该__init__()方法+
继承自object的新式类才有__new__
在实例化开始之后,在调用 __init__() 方法之前,Python 首先调用 __new__() 方法:
def __new__(cls,*args,**kwargs):
...
第一个参数cls是当前正在实例化的类。
如果要得到当前类的实例,应当在当前类中的 __new__() 方法语句中调用当前类的父类的 __new__() 方法。
事实上如果(新式)类中没有重写__new__()方法,即在定义新式类时没有重新定义__new__()时,Python默认是调用该类的直接父类的__new__()方法来构造该类的实例,如果该类的父类也没有重写__new__(),那么将一直按此规矩追溯至object的__new__()方法,因为object是所有新式类的基类。
解构器(__del__()):是在实例释放前提供特殊处理功能的方法,通常要到该实例对象所有的引用都被清除掉后才会执行。
解构器只能被调用一次
静态方法:
staticmethod(静态方法) 基本上和一个全局函数差不多,只不过可以通过类或类的实例对象(python里光说对象总是容易产生混淆, 因为什么都是对象,包括类,而实际上类实例对象才是对应静态语言中所谓对象的东西)来调用而已, 不会隐式地传入任何参数。这个和静态语言中的静态方法比较像。
classmethod (类方法)是和一个class相关的方法,可以通过类或类实例调用,并将该class对象(不是class的实例对象)隐式地
当作第一个参数传入。就这种方法可能会比较奇怪一点,不过只要你搞清楚了python里class也是个真实地 存在于内存中的对象,而不是静态语言中只存在于编译期间的类型。
函数修饰符:@staticmethod 和 @classmethod
组合:让不同的类混合并加入到其他类中,增加功能和代码重用性
子类:
创建子类和普通类没什么区别
继承:继承描述了基类的属性如何遗传给派生类,一个子类可以继承它的基类的任何属性
super语句调用父类方法 ,在super机制里可以保证公共父类仅被执行一次
对于super(B, self).__init__()是这样理解的:super(B, self)首先找到B的父类(就是类A),然后把类B的对象self转换为类A的对象
[b]super并非是一个函数,而是一个类[/b]
Python ljust() 方法返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串。如果指定的长度小于原字符串的长度则返回原字符串。
多重继承:
经典类:
经典类的搜索方式是按照“从左至右,深度优先”的方式去查找属性。d先查找自身是否有foo方法,没有则查找最近的父类C1里是否有该方法,如果没有则继续向上查找,直到在P1中找到该方法,查找结束。
新式类:沿着继承树一步一步上溯不同,它先查找同胞兄弟采用广度优先的方式
类、实例内建函数:
issubclass(sub,sup)判断sub是否为父类sup的
4000
子类,是的话返回True
isinstance(obj1,obj2)判定一个对象是否是另一个给定类的实例:obj1是类obj2或obj的一个子类的一个实例(第二个参数应该是类)
__str__和__repr__:
函数str() 用于将值转化为适于人阅读的形式,而repr() 转化为供解释器读取的形式
原位加法:__iadd__(),用来支持a+=b这样的操作符
特殊方法:
这些方法都是以__开始和结尾的
私有化:
双下划线(__):为类元素的私有性提供初步的形式,这种双下划线开始的属性被“混淆”(不能直接访问,需要在名字前面加上类名),这种私有成员只有类对象自己可以访问,子类对象不能访问
私有变量会在代码生成之前被转换为长格式(变为公有)
单下划线(_):
"单下划线" 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量
高级特性:
__slots__类属性:是一个类变量,由一序列型对象组成(可以是一个列表,元组或可迭代对象)
这种特性目的是节约内存(带__slots__ 属性的类不存在__dict__了 )
__getattribute__():
通过实例访问属性,如果class中定义了__getattr__(),则__getattr__()不会被调用(除非显示调用或引发AttributeError异常),每个属性的实例都会调用这个特殊方法
描述符:描述符可以实现这三种方法:__get__(),__set__(),__delete__()
函数是非数据描述符,函数的__get__()方法用来处理调用对象,并将调用对象返回给你
数据描述符协议函数Property()
property(fget=None,fset=None,fdel=None,doc=None)
前面3个参数都是未绑定的方法,所以它们事实上可以是任意的类成员函数
前三个参数分别对应数据描述符中的__get__,__set__,__del__方法
元类(Metaclasses):可以认为元类的实例是类,元类一般用于创建类(类工厂)
__metaclass__属性:如果类中有__metaclass__属性就用来创建类,没有就在父类中查找
用type创建类:
type(class_name,bases,dic)
元类参考:http://blog.jobbole.com/21351/#,写的很好
模块:operator模块提供了Python中大多数标准操作符函数版本
创建类:
class MyNewObjectType(bases): 'define MyNewObjectType class' class_suite
关键词是class,紧接着是一个类名,随后是定义类的类体代码
object是所有类之母,如果你所写的类没有继承其他任何父类,object将作为默认父类。它位于所有类继承结构的最上层。
创建一个实例的过程称为实例化:
myFirstObject = MyNewObjectType()
类的功能即方法
所有的方法声明中都有self参数,这个参数代表实例对象本身,当用实例调用方法时,不需要传递self,他是自动传入的
如果有两个参数,调用只需要传递第二个参数就好
__init__()是一个特殊的方法,当Python创建失利后,在实例化过程中调用__init__()方法
创建子类:
继承的子类将保持已存在类所有特性
类的创建:
简单的类的生声明可以是关键字后紧跟类名
在Python中定义紧跟着声明,并且同时所有的方法也必须同时被定义
类属性:
想知道一个类有哪些属性有两种方法:
1)使用内建函数dir(),返回的是对象属性的一个名字列表
2)访问类的字典属性__dict__,返回的是一个字典,键是属性名,键值是相应属性对象的数据值
特殊类:
__init__()是在解释器为你创建一个实例后调用的第一个方法
__new__()构造器方法:它作用在构造方法建造实例之前,在__init__()启动之前,__new__()决定是否要使用该__init__()方法+
继承自object的新式类才有__new__
在实例化开始之后,在调用 __init__() 方法之前,Python 首先调用 __new__() 方法:
def __new__(cls,*args,**kwargs):
...
第一个参数cls是当前正在实例化的类。
如果要得到当前类的实例,应当在当前类中的 __new__() 方法语句中调用当前类的父类的 __new__() 方法。
事实上如果(新式)类中没有重写__new__()方法,即在定义新式类时没有重新定义__new__()时,Python默认是调用该类的直接父类的__new__()方法来构造该类的实例,如果该类的父类也没有重写__new__(),那么将一直按此规矩追溯至object的__new__()方法,因为object是所有新式类的基类。
解构器(__del__()):是在实例释放前提供特殊处理功能的方法,通常要到该实例对象所有的引用都被清除掉后才会执行。
解构器只能被调用一次
静态方法:
staticmethod(静态方法) 基本上和一个全局函数差不多,只不过可以通过类或类的实例对象(python里光说对象总是容易产生混淆, 因为什么都是对象,包括类,而实际上类实例对象才是对应静态语言中所谓对象的东西)来调用而已, 不会隐式地传入任何参数。这个和静态语言中的静态方法比较像。
classmethod (类方法)是和一个class相关的方法,可以通过类或类实例调用,并将该class对象(不是class的实例对象)隐式地
当作第一个参数传入。就这种方法可能会比较奇怪一点,不过只要你搞清楚了python里class也是个真实地 存在于内存中的对象,而不是静态语言中只存在于编译期间的类型。
函数修饰符:@staticmethod 和 @classmethod
组合:让不同的类混合并加入到其他类中,增加功能和代码重用性
子类:
创建子类和普通类没什么区别
class SubClassName(ParentClass1[,ParentClass2,...]): 'optional class documentation string' class_suite
继承:继承描述了基类的属性如何遗传给派生类,一个子类可以继承它的基类的任何属性
super语句调用父类方法 ,在super机制里可以保证公共父类仅被执行一次
对于super(B, self).__init__()是这样理解的:super(B, self)首先找到B的父类(就是类A),然后把类B的对象self转换为类A的对象
[b]super并非是一个函数,而是一个类[/b]
Python ljust() 方法返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串。如果指定的长度小于原字符串的长度则返回原字符串。
多重继承:
经典类:
经典类的搜索方式是按照“从左至右,深度优先”的方式去查找属性。d先查找自身是否有foo方法,没有则查找最近的父类C1里是否有该方法,如果没有则继续向上查找,直到在P1中找到该方法,查找结束。
新式类:沿着继承树一步一步上溯不同,它先查找同胞兄弟采用广度优先的方式
类、实例内建函数:
issubclass(sub,sup)判断sub是否为父类sup的
4000
子类,是的话返回True
isinstance(obj1,obj2)判定一个对象是否是另一个给定类的实例:obj1是类obj2或obj的一个子类的一个实例(第二个参数应该是类)
__str__和__repr__:
函数str() 用于将值转化为适于人阅读的形式,而repr() 转化为供解释器读取的形式
原位加法:__iadd__(),用来支持a+=b这样的操作符
特殊方法:
这些方法都是以__开始和结尾的
私有化:
双下划线(__):为类元素的私有性提供初步的形式,这种双下划线开始的属性被“混淆”(不能直接访问,需要在名字前面加上类名),这种私有成员只有类对象自己可以访问,子类对象不能访问
私有变量会在代码生成之前被转换为长格式(变为公有)
单下划线(_):
"单下划线" 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量
高级特性:
__slots__类属性:是一个类变量,由一序列型对象组成(可以是一个列表,元组或可迭代对象)
这种特性目的是节约内存(带__slots__ 属性的类不存在__dict__了 )
__getattribute__():
通过实例访问属性,如果class中定义了__getattr__(),则__getattr__()不会被调用(除非显示调用或引发AttributeError异常),每个属性的实例都会调用这个特殊方法
描述符:描述符可以实现这三种方法:__get__(),__set__(),__delete__()
函数是非数据描述符,函数的__get__()方法用来处理调用对象,并将调用对象返回给你
数据描述符协议函数Property()
property(fget=None,fset=None,fdel=None,doc=None)
前面3个参数都是未绑定的方法,所以它们事实上可以是任意的类成员函数
前三个参数分别对应数据描述符中的__get__,__set__,__del__方法
元类(Metaclasses):可以认为元类的实例是类,元类一般用于创建类(类工厂)
__metaclass__属性:如果类中有__metaclass__属性就用来创建类,没有就在父类中查找
用type创建类:
type(class_name,bases,dic)
元类参考:http://blog.jobbole.com/21351/#,写的很好
模块:operator模块提供了Python中大多数标准操作符函数版本
相关文章推荐
- 只需十分钟,结果大不同 |《深度思考》
- 《洋葱阅读法》读书笔记
- Jquery实战_读书笔记1―选择jQuery
- JavaScript 精粹读书笔记(1,2)
- JavaScript 权威指南(第四版) 读书笔记
- Terry七月Ruby读书笔记(比较详细)第1/4页
- 整理java读书笔记十五之java中的内部类
- 从「林」开始--C++ primer 读书笔记 -- Part II: Containers ...
- 读书笔记-大型分布式网站架构-设计与实践【陈康贤】
- [读书笔记]Scrum 总结
- 大型网站架构系列:负载均衡详解
- 《穷爸爸,富爸爸》读书笔记
- 《程序员的职业素养》读书笔记
- sniff读书笔记
- 《Zabbix监控系统深度实践》读书笔记
- 《DevOps故障排除:Linux服务器运维最佳实践》读书笔记
- 重学JS 1
- 《javascript高级程序设计》读书笔记——引用类型之Object类型(细节整理)
- 《HTML重构》读书笔记&思维导图
- <读书笔记>软件调试之道 :问题的核心-诊断