面向对象编程
面向对象编程是一种程序设计范式,把程序看作不同对象的相互调用,对现实世界建立对象模型。
创建实例
定义一个Person
类如下:
class Person(object):
pass
格式为:
class 类名(object): # object表示定义的类是由那个类继承下来的
函数体
pass
类名一般以大写开头。创建实例使用类名 + ()
,类似函数的形式创建:
XvSong = Person() # 创建”许嵩“对象
初始化实例属性
在定义 Person 类时,可以为Person类添加一个特殊的init()
方法,当创建实例时init()
方法,当创建实例时,__init__()
方法被自动调用,能在此为每个实例都统一加上以下属性:
class Person(object):
def __init__(self, name, gender, birth):
self.name = name
self.gender = gender
self.birth = birth
__init__()
方法的第一个参数必须是 self
,后续参数则可以自由指定。创建实例时,就必须要提供除 self
以外的参数:
XvSong = Person('XvSong', 'Male', '1987-1-1')
要定义关键字参数,使用 **kw;除了可以直接使用self.name = 'xxx’设置一个属性外,还可以通过 setattr(self, ‘name’, ‘xxx’) 设置属性。下面是一个例子:
定义Person
类的__init__
方法,除了接受 name
、gender
和 birth
外,还可接受任意关键字参数,并把他们都作为属性赋值给实例。
参考代码如下:
class Person(object):
def __init__(self, name, gender, **kw):
self.name =name
self.gender = gender
for k, v in kw.items():
setattr(self, k, v)
pass
pass
pass
再输入:
XvSong = Person('XvSong', 'Male', job='Singer', face='Beautiful')
print(XvSong.name)
print(XvSong.job)
print(XvSong.face)
输出如下:
XvSong
Singer
Beautiful
创建类属性
定义类属性可以直接在 class 中定义:
class Person(object):
address = 'Earth'
def __init__(self, name):
self.name = name
因为类属性是直接绑定在类上的,所以,访问类属性不需要创建实例,就可以直接访问:
print(Person.address)
输出如下:
Earth
Python是动态语言,类属性也是可以动态添加和修改的:
Person.address = 'China'
print(Person.address)
输出如下:
China
因为类属性只有一份,所以,当Person类的address改变时,所有实例访问到的类属性都改变了。 在 class 中定义的实例方法其实也是属性,它实际上是一个函数对象:
class Person(object):
def __init__(self, name, score):
self.name = name
self.score = score
def get_grade(self):
return 'A'
再输入:
p1 = Person('Bob', 90)
print(p1.get_grade)
输出如下:
<bound method Person.get_grade of <__main__.Person object at 0x0148FE90>>
输入如下:
print(p1.get_grade())
输出如下:
A
就是说,p1.get_grade返回的是一个函数对象,但这个函数是一个绑定到实例的函数,p1.get_grade()才是方法调用。
访问限制
可以给一个实例绑定很多属性,如果有些属性不希望被外部访问到怎么办?Python对属性权限的控制是通过属性名来实现的,如果一个属性由双下划线开头(__),该属性就无法被外部访问。下面的代码是一个例子:
class Person(object):
def __init__(self, name):
self.name = name
self._title = 'Mr'
self.__job = 'Student'
输入如下:
p = Person('Bob')
print(p.name)
输出如下:
Bob
输入如下:
print(p._title)
输出如下:
Mr
输入如下:
print(p.__job)
运行上面一行后会出错。
如果一个属性以__xxx__
的形式定义,那它又可以被外部访问了。以__xxx__
定义的属性在Python的类中被称为特殊属性。有很多预定义的特殊属性可以使用,通常不要把普通属性用__xxx__
定义。以单下划线开头的属性_xxx
虽然也可以被外部访问,但是,按照习惯不应该被外部访问。