第四章 面向对象
4.1 python进阶4-1 python之面向对象编程
什么是面向对象编程?
面向对象编程是一种程序设计范式
把程序看做不同对象的相互调用
对现实世界建立对象模型
面向对象编程的基本思想
类和实例
类用于定义抽象类型
实例根据类的定义被创建出来
面向对象编程:数据封装
4.2 python之定义类并创建实例
在python中,类通过class关键字定义。
class Person(object):
pass
按照python的编程习惯,类名以大写字母开头,紧接着是(object),表示该类是从哪个类继承下来的。
创建实例使用 类名+()
4.3 python中创建实例属性
如何让每个实例拥有各自不同的属性?
由于python是动态语言,对每一个实例,可以直接给他们的属性赋值
4.4 python中初始化实例属性
在定义Person类时,可以为Person类添加一个特殊的init()方法,当创建实例时,init()方法被自动调用
,我们就能在此为每个实例都统一加上以下属性:
class Person(object):
def init(self,name,gender,birth):
self.name = name
self.gender=gender
self.birth=birth
init()方法的第一个参数必须是self(也可以用别的名字,但建议使用习惯用法),后续参数则可以自由指定,
和定义函数没有任何区别。
要定义关键字参数,使用**kw
除了可以直接使用self.name=’xxx’设置一个属性外,还可以通过setattr(self,’name’,’xxx’)设置属性
4.5 python中访问限制
python对属性权限的控制是通过属性名来实现的,如果一个属性由双下划线开头(__),该属性就无法被外部访问。
以”xxx“定义的属性在pythonzhong的类中被成为特殊属性,有很多预定义的特殊属性可以使用。
以单下划线开头的属性”_xxx”虽然可以被外部访问,但是按照习惯,不推荐这样使用。
4.6 python中创建类属性
类是模板,实例是根据类创建的对象。
绑定在一个实例上的属性不会影响其他实例,但是,类本身也是一个对象,如果在类上绑定一个属性,则所有实例
都可以访问类的属性,并且,所有实例访问的类属性都是同一个。
实例属性每个实例各自拥有,互相独立,而类属性有且只有一份。
class Person(object):
address = ‘Earth’
因为类属性是直接绑定在类上的,所以,访问类属性不要创建实例,就可以直接访问:
print Person.address
对一个实例调用类的属性也是可以访问的,所有实例都可以访问到它所属的类的属性。
类属性可以动态添加和修改。
class Person(object):
count=0
def init(self,name,count):
Person.count+=1
self.name = name
4.7 python中类属性和实例属性名字冲突怎么办
当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问。
不要在实例上修改类属性,它实际上并没有修改类属性,而是给实例绑定了一个实例属性。
4.8 python中定义实例方法
一个实例的私有属性就是以_开头的属性,无法被外部访问,那这些属性定义有什么用?
虽然私有属性无法从外部访问,但是,从类的内部是可以访问的。除了可以定义实例的属性外,还可以定义实例的
方法。
实例的方法就是在类中定义的函数,它的第一个参数永远是self,指向调用该方法的实例本身,其他参数和一个普
通函数是完全一样的。
class Person(object):
def init(self,name):
self.__name=name
def get_name(self):
return self.__name
调用实例方法必须在实例上调用。
在实例方法内部,可以访问所有实例属性,这样,如果外部需要访问私有属性,可以通过方法调用获得, 这种数据
封装的形式除了能保护内部数据一致性外,还可以简化外部调用的难度。
class Person(object):
def init(self,name,score):
self.name=name
self.__score=score
def get_grade(self):
if(self.__score>80):
return ‘A-优秀’
elif(self.__score>60):
return ‘B-及格’
return ‘C-不及格’
4.9 python中方法也是属性
在class中定义的实例方法其实也是属性,实际上是一个函数对象。
因为方法也是一个属性,所以,它可以动态的添加到实例上,只是需要用types.MethodType()把一个函数变为一个
方法:
p1.get_grade = types.MethodType(fn_get_grade, p1, Person)
4.10 python中定义类方法
和属性类似,方法也分为实例方法和类方法
在class中定义的全部是实例方法,实例方法第一个参数self是实例本身。
要在class中定义类方法,要这么写:
class Person(object):
count=0
@classmethod
def how_many(cls):
return cls.count
def init(self,name):
self.name=name
Person.count+=1
print Person.how_many()
p1=Person(‘Bob)
print Person.how_many()
通过标记一个@classmethod,该方法将绑定到Person类上,而非类的实例。类方法的第一个参数将传入类本身,通
常将参数名命名为cls,上面的cls.count实际上相当于Person.count.
因为是在类上调用,而非实例上调用,因此类方法无法获得任何实例变量,只能获得类的引用。