一. 面向对象编程 Object-Oriented Programing
- 什么是对象:对象是指现实中的物体或实物;
- 什么是面向对象:把一切看成对象(实例),用各种对象之间的关系来描述实物
- 对象都有什么特征:
- 对象有很多属性(名词):可以通过实例访问的变量称为属性,如:姓名,性别,年龄,...
- 对象有很多行为(动作):学习,吃饭,睡觉...
- 面向对象的最大优势:每个对象可以管理自己的资源
二. 什么是类
拥有相同属性,行为的对象分为一组,即为一个类。类是用来描述对象的工具,用类可以创建此类的对象(实例)。int float complex dict bytes set str tuple list ValueError ... python中已经为我们写好了很多类,但并不能满足所有需求,有时需要我们自己创建类,类的创建使用class语句,如下:
-
语法:
class 类名(继承列表):
'''类文档字符串'''
实例方法定义
类变量定义
类方法定义(@classmethod)
静态方法定义(@staticmethod) - 作用:
- 创建一个类;
- 用于描述对象的行为和属性;
- 用于创建此类的一个或多个同类对象(实例)
- 说明:
- 继承列表可以省略,省略继承列表表示此类继承自object;
- 类名必须为标识符;
- 类名实质是个变量,绑定一个类
三. 实例方法和实例属性
- 语法:
class 类名(继承列表):
def 实例方法(self, 形参1, 形参2, ...):
'''方法的文档字符串'''
语句块
- 作用:用于描述一个对象的行为,让此类型的全部对象都拥有相同的行为;
- 说明:
- 实例方法的实质是函数,是定义在类内的函数;
- 实例方法至少有一个形参,第一个形参代表调用这个方法的实例,一般命名为'self';
- 实例方法的调用语法:
- 实例.实例方法名(调用传参)
- 类名.实例方法名(实例,调用传参)
- 实例属性也叫实例变量:每个实例可以使用自己的变量,称为实例变量(也叫属性)
- 使用语法:实例.属性名;
- 属性的赋值规则:首次为属性赋值则创建属性,再次为属性赋值则改变属性的绑定关系;
- 作用:记录每个对象自身的数据;
- 删除属性:del 对象.属性名
- del 语句总结:
- 删除变量 del a;
- 删除列表中的元素 del L[0];
- 删除字典中的键 del d['name'];
- 删除对象的属性 del dog1.color
四. 构造函数
- 构造函数调用表达式:(函数名是个类名)
类名([创建传参列表])
- 作用:创建这个类的实例对象,并返回此实例对象的引用关系;
- 说明:
- 实例有自己的作用域和名字空间,可以为该实例添加实例变量(也叫属性);
- 实例可以调用类方法和实例方法;
- 实例可以访问类变量和实例变量
五. 初始化方法
- 作用:对新创建的对象添加属性等初始化操作;
- 语法格式:
class 类名(继承列表)
def __init__(self[,形参列表])
语句块
注:[]里的内容代表可省略
- 说明:
- 初始化方法名必须为__init__不可改变;
- 初始化方法会在构造函数创建实例后自动调用;
- 构造函数的实例将通过__init__方法的参数列表传入到__init__方法中;
- 初始化方法内如果需要return语句返回,则只能返回None。
六. 析构方法
- 语法:
class 类名(继承列表):
def __del__(self):
语句块
- 作用:通常用来释放此对象占用的资源;
- 说明:析构方法会在对象被销毁时自动调用;python语句建议不要在对象销毁时做任何事情,因为对象销毁的时间难以确定。
- code
"""析构方法的用法"""
class Car:
"""docstring for Car"""
def __init__(self, name):
self.name = name
print('汽车', name, '对象被创建')
def __del__(self):
print('汽车', self.name, '对象被销毁')
c1 = Car('BYD E6')
l1 = list()
l1.append(c1)
# 引用计数法:虽然c1变量绑定了None对象,但列表中仍有变量绑定Car('BYD E6')对象,故Car('BYD E6')不被销毁
c1 = None
# 阻止程序退出,因为在程序退出时,对象将被自动销毁
while True:
pass
七. 预置的实例属性
- __dict__属性:绑定一个存储此实例自身变量的字典
- __class__属性:绑定创建此实例的类(类实例),可以借助此属性来访问创建此实例的类
八. 用于类的函数
- isinstance(obj, class_or_tuple) 返回这个对象obj是否是某个类的对象,或者某些类中的一个类的对象,如果是则返回True,否则返回False;
- type(obj) 返回对象的类
- 示例:
利用Python实现的学生类:
"""此类用来描述学生信息.要求如下:
1.为该类添加初始化方法,实现在创建对象时自动设置'姓名' '年龄' '成绩'属性;
2.添加set_score方法,能为对象修改成绩信息,并限制成绩在0-100之间;
3.添加show_info方法打印学生对象的信息
"""
class Student:
def __init__(self, name, age, score):
"""每当根据student类创建实例时,都将自动运行此方法"""
self.name = name
self.age = age
self.score = score
def set_score(self, score):
"""self实参将自动被传递,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法"""
try:
assert 0 <= score <= 100, '成绩有误,无法修改!'
self.score = score
except AssertionError as err:
print(score, err)
def show_info(self):
print('%s今年%d岁,成绩是:%d' % (self.name, self.age, self.score))
def get_score(self):
return self.score
if __name__ == "__main__":
# 传递的参数由__init__方法的形参决定
s1 = Student('Limuxia', 22, 99)
s1.show_info()
s1.set_score(100)
s1.show_info()
s1.set_score(200)
s1.show_info()
# 面向对象变成中不建议在调用程序中直接修改和获取实例的属性,而是通过方法来返回对象的属性
print('s1绑定的对象成绩是:', s1.get_score())