1 概述
面向对象(Object Oriented,英文缩写OO)是一种设计思想。
- 对象:划分两个部分,静态部分和动态部分。静态部分称为属性,即客观存在的事实;动态部分为对象的行为,即对象执行的动作。
- 类:类是封装对象的属性和行为的载体,反过来说具有相同属性和行为的一类实现被称为类。
面向对象程序设计的特点:
- 封装
- 继承
- 多态
2 定义类
在Python中,类的定义需要用class关键字来实现。
# 创建一个类
class People:
pass
# 创建实例
Jack = People()
Mike = People()
3 创建__init__()方法
创建__init__()方法时,在类的创建中会被python自动执行。
其中可以定义类的属性:self.name = ‘xxx’,也可以利用参数在初始化时给类的属性赋值:
# 创建中国人类
class Chinese:
def __init__(self, sex, age):
# 参数初始化类的属性
Chinese.sex = sex
Chinese.age = age
# 自动初始化类的属性
self.country = 'China'
Jack = Chinese('male', '19')
print('My name is Jack.')
print('From : ', Jack.country)
print('Sex : ', Jack.sex)
print('Age : ', Jack.age)
4 访问限制
- 首位双下划线特殊定义方法,一般是系统定义名字,如__init__()。
- 以单下划线开头表示protect(保护)成员,只允许子类和类本身访问,不能用from modulename import * 导入。
class Chinese:
def __init__(self):
self._country = 'China'
def show_country(self):
return self._country
Jack = Chinese()
# 子类访问
print(Jack._country)
# 类本身访问
print(Jack.show_country())
- 以双下划线开头表示private(私有)成员,只允许类本身访问。
class Chinese:
def __init__(self):
self.__country = 'China'
def show_country(self):
return self.__country
Jack = Chinese()
# 类本身访问
print(Jack.show_country())
# 如果用以下子类访问会产生错误提示
# print(Jack.__country)
5 属性(property)
在python中可以利用@property(装饰器)将一个函数转化为属性,从而实现用于计算的属性。即不需要添加()在末尾。
class Chinese:
def __init__(self):
self.__country = 'China'
@property
def show_country(self):
return self.__country
Jack = Chinese()
print(Jack.show_country)
注意:通过 @property 转换后的属性不能重新赋值,如果重新赋值会提示错误。同理我们可以利用这一特性,为属性添加安全保护机制,使其不可修改。
6 继承
子类继承基类格式如下:
# 基类
class Baseclassname:
pass
# 子类
class Classname(Baseclassname):
pass
当子类中某个方法(函数)与基类不同时,需要在子类内重写该方法(函数):
class People:
def get_age(self):
pass
class Chinese(People):
def get_age(self):
pass
子类用__init__()初始化的时候,不会调用基类的__init__()初始化。如果需要在子类__init__()初始化时,调用基类的__init__()初始化,则需要用如下方法:
class People:
def __init__(self):
People.feature = '会独立思考,具有很强的语言天赋'
class Chinese(People):
def __init__(self, name, age):
Chinese.country = 'China'
self.name = name
self.age = age
# 调用基类__init__()方法
super().__init__()
Jack = Chinese('Jack', '19')
print(Jack.name, '的个人信息')
print('From : ', Jack.country)
print('Age : ', Jack.age)
print('Feature : ', Jack.feature)
如果没有调用基类的__init()初始化的话,Jack.feature则会报错:
AttributeError: 'Chinese' object has no attribute 'feature'