1 介绍
面向对象编程是一种程序设计范式
把程序看做不同对象的相互调用,对现实世界建立对象模型。
面向对象编程的基本思想:
类和实例:
类用于定义抽象类型
实例根据类的定义被创建出来
2 定义类并创建实例
类通过class关键字定义,类名以大写字母开头,紧接着是(object),表示该类是从哪个类继承下来的。
class Person(object):
pass
xiaoming = Person() #创建实例
xiaohong = Person()
3 创建实例属性
对每一个实例,都可以直接给他们的属性赋值。
例如,给xiaoming这个实例加上name,gender和birth属性:
xiaoming = Person()
xiaoming.name = 'XiaoMing'
xiaoming.gender = 'Male'
xiaoming.birth = '1990-1-1'
给xiaohong加上的属性不一定要和xiaoming相同:
xiaohong = Person()
xiaohong.name = 'Xiao Hong'
xiaohong.school = 'No.1 High School'
xiaohong.grade = 2
实例属性可以像变量一样进行操作:
xiaohong.grade = xiaohong.grade + 1
4 初始化实例属性
Person类在创建的时候就拥有name、gender、birth属性。
在定义Person类时,可以为Person类添加一个特殊的__init__()方法,当创建实例时,这个方法被自动调用。
__init__()方法的第一個参数必須是self(也可以是別的名字,但建议使用习惯用法)。
class Person(object):
def __init__(self, name, gender, birth):
self.name = name
self.gender = gender
self.birth = birth
xiaoming=Person('Xiao Ming', 'Male', '1991-1-1')
xiaohong=Person('Xiao Hong', 'Female', '1992-2-2')
5 访问限制
Python对属性权限的控制是通过属性名来实现的。
如果一个属性由双下划线开头(__),该属性就无法被外部访问。
class Person(object):
def __init__(self, name):
self.name = name
self._title = 'Mr'
self.__job = 'Student'
>>> p = Person('Bob')
>>> print p.name #ok
>>> print p._title #ok
>>> print p.__job #error
如果一个属性以"__xxx__"的形式定义,那它又可以被外部访问了,以"__xxx__"定义的属性在Python的类中被称爲特殊属性。
由很多预定义的特殊属性可以使用,通常不把普通属性用以"__xxx__"定义。
6 创建类属性
相当于java类的静态变量。
class Person(object):
address = 'Earth' #类属性
def __init__(self, name)
self.name = name
可以直接访问类属性,而不必通过类的实例访问。
>>> print Person.address #Earth
类属性也可以动态添加和修改:
Person.address = 'China'
在实例上修改类属性时,实际上并没有修改类属性,而是给实例绑定了一个实例属性。
当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问。
所以千万不要在实例上修改类属性。
7 定义实例方法
一个实例的私有属性就是以__开头的属性,无法被外部访问。
实例的方法就是在类中定义的函数,它的第一个参数永远是self,指向调用该方法的实例本身,其他参数和一个普通函数完全一样。
class Person(object):
def __init__(self, name):
self.__name = name
def get_name(self):
return self.__name
在class中定义的实例方法其实也是属性,它实际上是一个函数对象。
8 定义类方法
相当于java的静态方法
和属性类似,方法也分实例方法和类方法
通过@classmethod可以将方法绑定到类上,类方法的第一个参数将传入类本身,通常将参数命名为cls。
class Person(object):
count = 0
@classmethod
def how_many(cls):
return cls.count
def __inti__(self, name):
self.name = name
Person.count = Person.count + 1
>>> print Person.how_many()
>>> p1 = Person('Bob')
>>> print Person.how_many()
因为是在类上调用,而非实例上调用,因此类方法无法获得任何实例变量,只能获得类的引用。