Python核心编程---读书笔记:第13章 面向对象编程
2017-03-20 22:56
302 查看
第13章 面向对象编程
13.1介绍经典类:没有父类的类
类中参数self等同于this
__init__() 类似于类的构造器,python创建对象时就会执行该方法
子类的初始化时,先调用父类的构造函数初始化,子类需要定义自己构造器,否则基类构造器会被调用,若子类重写构造器,父类的不会被调用
def __init__(self , name , phone , id):
ParentClass.__init__(self, name , phone)
self.id= id
多态:一个操作,多个响应
反射:对象在运行期获取自身信息
静态成员:跟踪与类相关的值
class Test(object):
name= ‘dong’ #静态成员
dir(对象):返回对象的属性名字列表
13.4.3特殊的类属性
C.__name__ :类的名字
C.__doc__ : 类C的文档字符串
C.__bases__: 类C的所有父类构成的元组
C.__dict__ :属性
C.__module__: 类C所在模块
C.__class__ :实例C对应的类
__new__():调用类的__new__()方法,是静态方法,会调用父类的__new__()来创建对象
__del__():解构器方法,只能被调用一次
总结:
1先调用父类的__del__()
尽量不要实现__del__()
13.6.1实例化实例属性
在运行时创建实例属性,python是动态语言,允许对象属性动态创建
修改静态成员变量危险
13.7.1调用绑定方法
13.8.1 staticmethod()和classmethod()内建函数
静态方法
clas MyClass:
@staticmethod
def foo
13.10.1创建子类
class SubClass(ParClass1, ParClass2,…)
__base__ :返回其父类的元组
子类中调用父类方法:
super(ChildClass , self).foo()
重写__init__不会自动调用基类的__init__,如果需要,就要调用积累的构造方法
super(ParentClass , self).__init__()
13.11.4多重继承
方法解释顺序(MRO):深度优先,从左到右搜索,取得在子类中使用的属性,取找到的第一个名字
C2.bar(gc)
想要指定调用父类的方法,就在父类该方法中传入子类实例
经典类:没有继承自object,深度优先
新式类:继承自object,广度优先
新式类查找方法采用广度优先,优先搜索父类,然后才是祖先类
13.12类、实例和其他对象的内建函数
13.12.1 issubclass()判断一个类是另一个类的子类或者子孙类
issubclass(sub , sup)
class Parent(object):
def __init__(self
, name):
self.name= name
class Child(Parent):
def __init__(self,
name ,age):
super(Parent,
self).__init__()
self.age = age
if __name__ == "__main__":
if issubclass(Child , Parent):
print("child is subclass of parent")
isinstance():判断一个对象是否是另一个类的实例
isinstance(obj1 , obj2):
isinstance(4,int)
isinstance(4, tuple(int , float))
hasattr():判断对象是否有特定属性
getattr():
setattr():
if hasattr(child ,
'age'):
print("has attr age")
myage = getattr(child, 'age')
print('age is %d'
% (myage))
setattr(child, 'age'
, 33)
print('age changed is %d'
% (child.age))
else:
print("not has attr age")
dir():作用在实例上,显示实例所在类(包含基类)的方法和属性
super(type , obj):返回type的父类,向父类绑定,传入obj
super(ParentClass , self).__init__()
vars():返回字典,包含对象的属性和
__del__():析构器
delattr(obj , attr):删除属性
定制类的特殊方法
C.__cmp__(self , obj)
C.__lt__(self , obj) and
C.__*add__(self , obj): 加: +操作符
C.__*or__(self , obj): 按位或
C.__neg__(self):一元负
C.__int__(self):转换为int
重载加法使用__add__()
def __add__(self , other):
returnself.__class__(self.hr + other.hr , self.min + other,min)
原位加: def __iadd__(self , other)
13.13.3 迭代器(RandSeq和AnyIter)
创建迭代器使用__iter__(),和next()方法
多类型定制:参见重载加法,乘法,比较等函数
13.14 私有化
双下划线__ :等同于private
单下划线_ :模块级别私有化
实现授权的关键点:覆盖__getattr__()方法
严格匹配用 is操作符, isinstance()很灵活
__slots__类属性
假设实例为inst,属性为foo,
使用inst.foo和inst.__dict__[‘foo’]访问是一致的
如果属性很少,实例很多,使用__slots__属性来替代__dict__。
__slots__ :包含了属性集合,可节约内存
__getattribute__():__getattr__()在属性不能从类中找到时才被调用
13.16.4 描述符
描述符:对象属性的代理,是一个类属性
__get__(),__set__() , __delete__()
property(fget=None,fset=None,fdel=None,doc=None)
将property写在类定义中
13.16.5 Metaclasses和__metaclass__
元类:定义类如何被创建,其实例是其他的类。
适用:用于创建类。解释器寻找类属性__metaclass__,如果属性存在,就将属性赋值给此类作为它的元类。
传递的参数:类名,从基类继承数据的元组,类属性字典
元类的作用:改变类的默认行为
另一种元类用法:创建元类,要求其他人写的类中都提供__str__()方法
相关文章推荐
- Python核心编程笔记 - 第13章 面向对象编程(二)
- Python核心编程笔记 - 第13章 面向对象编程 (一)
- Python核心编程---读书笔记:第1章~第3章
- Python核心编程---读书笔记:第8章 条件和循环
- Python核心编程---读书笔记:第12章 模块
- Python核心编程---读书笔记:第6章 序列:字符串、列表和元祖
- 《Python 编程快速上手 — 让繁琐工作自动化》读书笔记之【第13章 处理PDF和Word文档(1)】
- Python核心编程---读书笔记:第14章 执行环境
- 『Python学习』python 核心编程——面向对象编程学习笔记
- Python核心编程---读书笔记:第10章 错误和异常
- Python核心编程---读书笔记:第5章 数字
- python核心编程---读书笔记:第18章 多线程编程
- Python核心编程 读书笔记
- python核心编程学习记录之面向对象编程
- 《Python 编程快速上手 — 让繁琐工作自动化》读书笔记之【第13章 处理PDF和Word文档(2)】
- python核心编程---读书笔记:第16章 网络编程
- python核心编程---读书笔记:第21章 数据库编程
- Python核心编程---读书笔记:第7章 映射和集合类型
- Python核心编程---读书笔记:第4章 Python对象
- 《Python 核心编程》--第六章读书笔记