day17回顾:
- 面向对象
- 对象 object(实例 instance)
面向对象 - 类 class
类的定义的语句 class 语句
class 类名(继承列表):
# 实例方法
def 实例方法名(self, 方法的形参):
...
def __init__(self, 形参列表):
...
def __del__(self):
...
-
构造函数:
类名(调用传参) -
对象的特征:
- 行为(实例方法)
吃,睡, - 属性(实例变量)
姓名,年龄
- 行为(实例方法)
class Dog:
pass
dog1 = Dog()
dog1.color = "白色"
-
del 语句:
删除对象的属性 -
序置属性:
dict 属性
绑定存储此对象的属性的字典
__class__属性
绑定创建此对象的类 -
函数:
isinstance(对象, 类或元组) 判断对象是否属于某个类或某些类的一个类的实例
type(对象) # 返回一个对象的类
day18笔记:
- 类变量
- 类方法
- 静态方法
- 单继承
- 封装
- 多态
类变量
类变量是类的属性,此属性属于类,不属于类的实例
-
作用:
通常用来存储该类创建的对象的共有属性 -
说明:
类变量可以通过该类直接访问
类变量可以通过类的实例直接访问(取值)
类变量可以通过此类的对象的__class__属性间接访问 -
类的文档字符串:
类内第一个没有赋值给变量的字符串为文档字符串
类的文档字符串可以用类的 doc 属性访问 -
类的 slots 列表
- 作用:
- 限定一个类创建的实例只能有固定的实例变量(实例属性)
- 不允许对象添加列表以外的实例属性
- 防止用户因错写属性名称而发生错误
- 说明:
- __slots__属性是一个列表,列表的值是字符串
- 含有__slots__属性的类所创建的对象没有__dict__属性,即此实例不用字典来存储实例属性
- 作用:
类方法 @classmethod
类方法是用于描述类的行为的方法,类方法属于类,不属于该类创建的实例对象
- 说明:
- 类方法需要使用@classmethod装饰器定义
- 类方法至少有一个形参,第一个形参用于绑定类,约定写为’cls’
- 类和该类的实例都可以调用类方法
- 类方法不能访问此类创建的对象的实例属性
示例见:
class_method.py
-
静态方法@staticmethod
静态方法是定义在类的内部的函数,此函数的作用域是类的内部- 说明:
- 静态方法需要使用@staticmethod装饰器定义
- 静态方法与普通函数定义相同,不需要传入’self’和’cls’ 参数
- 静态方法只能凭借该类或类的实例调用
- 静态方法不能访问类变量和实例变量
- 说明:
-
用类来描述一个学生的信息(可以修改之前写的Student类)
class Student:
… 以下自己实现
学生信息有:
姓名, 年龄, 成绩
将这些学生对象存于列表中,可以任意添加和删除学生信息.- 打印出学生的个数
- 打印出所有学生的平均成绩
- 打印出所有学生的平均年龄
(建议用列表的长度来计算学生的个数)
继承 (inhertance) 和 派生 (derived)
继承是从已有的类中派生出新的类,新类具有原类的属性和行为,并能扩展新的能力
派生类就是从一个已有类中衍生出新类,在新的类上可以添加新的属性和行为
- 作用:
- 用继承派生机制,可以将一些共有功能加在基类中,实现代码的共享
- 在不改变基类代码的基础上改变原有类的功能
- 名词:
基类(base class),超类(super class), 父类(father class)
派生类(derived class), 子类(child class))
- 单继承
- 语法:
class 类名(基类名):
语句块
- 说明:
单继承是指派生类由一个基类衍生出来
-
继承说明:
Python3任何类都直接或间接的继承自object类
object类是一切类的超类 -
类的 __base__属性
作用:
用来绑定此类的基类
python3中的内建内继承关系见:
help(builtins)
-
覆盖 override
什么是覆盖:
覆盖是指在有继承关系的类中,子类中实现了与基类同名的方法,在子类的实例调用该方法时,实际调用的是子类中覆盖版本,这种现象叫做覆盖 -
子类对象显式调用基类方法的方式:
基类名.方法名(实例, 实际调用传参…) -
super函数
super(cls, obj) 返回绑定超类的实例(要求obj必须是cls类型的实例)
super() 返回绑定超类的实例,等同于super(class, 实例方法的第一个参数) 必须在方法内调用- 作用:
借助super() 返回实例间接调用父类的覆盖方法
- 作用:
-
显式调用基类的初始化方法:
当子类中实现了__init__ 方法,基类的实始化方法并不会被调用,此时需要显式调用基类的初始化方法 -
练习:
- 修改原来的学生信息管理程序,将原来用字典存储学生信息改变用学生Student类型的对象来存储信息
要求:- 类 Student 存于文件 student.py中
- 尽量少在类的外部使用实例变量(建议增加实例方法来获取实例变量的信息)
- 修改原来的学生信息管理程序,将原来用字典存储学生信息改变用学生Student类型的对象来存储信息