第七章 创建对象
7.1 对象的魔力
多态性(Polymorphism):
方法—绑定到对象上的函数
更多的方法(行为)称为多态,包括各种运算和函数
封装性(Encapsulation)—封装是对全局作用域中其他区域隐藏多余信息的原则。
多态是让用户对于不知道是什么类的对象进行方法调用—方法
封装是可以不用关心对象是如何构建的而直接进行使用—特性
注:对象的状态由特性描述,对象的方法可以改变特性。
继承性(Inheritance)
从父类继承方法,避免再写一次。
7.2 类和类型
类:所有的对象都属于某一个类,称为类的实例。类分子类和超类(父类)
创建类:__metaclass__=type #确定使用新式类(3.0后无旧式类)
class Person: #定义类的名称
def setName(self,name): #定义方法(函数)和特性等
self,name=name
def getName(self):
return self.name
>>>foo=Person()
>>>foo.setName(‘Shen Jianliang’)
>>>foo.name #访问特性
注:self的用处:在调用方法/函数时,foo自动将自己作为第一个参数传入函数,没有self,成员方法就无法访问对象本身
特性、函数和方法:方法(更专业一点可称为绑定方法)将它们的第一个参数绑定到所属的实例上,因为这个参数可以不必提供。
self 参数并不取决于调用方法的方式。
私有化:让方法或者特性变为私有,外部无法访问,在其名字之前加双下划线,类内部可以访问。在类内部定义中,所有以双下划线开始的名字都被翻译成前面加上单下划线和类名的形似。
类的命名空间:类命名空间可以在类内所有成员访问,类的定义实际上就是执行代
码块。
>>> __metaclass__=type
>>> class MemberCounter:
members=0
def init(self):
MemberCounter.members+=1
>>> m1=MemberCounter()
>>> m1.init() #运行一次
>>> MemberCounter.members
1
>>> m2=MemberCounter()
>>> m2.init() #运行两次
>>> MemberCounter.members
2
>>> m1.members #类作用域内的变量可以被所有实例访问
2
>>> m1.members='two' #重定义m1的作用域变量,m2被屏蔽
>>> m1.members
'two'
>>> m2.members
2
指定超类:子类可以扩展超类的定义,将其他类名写在class语句后的()内可以指定超类,将方法继承过来,或者重新定义超类的某些方法。
>>>class filter:
def function(self)
…
def filter()
>>>class spamfilter(filter): #filter是超类
def function(self) #重新定义超类的方法
>>>s=spamfilter()
>>>s.init()
>>>s.filter(…) #filter是从超类中继承而来的,子类中不需要再写
调查超类:使用issubclass(子,超)来判断,返回true/false
也可以使用__bases__特性来寻找父类
isinstance(对象,类)检查对象是否是类的实例
也可以用__class__特性检查对象所属哪个类
多个超类:子类可以不做任何事(pass),但可以指定多个超类,并继承所有的行为
也称为多重继承,需要注意超类的顺序,先继承的类中的方法会重写后
继承的类的方法。
接口和内省:公开的方法和特性。