class类、function方法
- 封装
- 继承
- 多态
class Student():
name = "bidding."
age = 12
print(Student.__dict__)
a = Student()
print(a.__dict__)
print(a.name)
print(a.age)
print(id(Student.name))
print(id(a.name))
{'__module__': '__main__', 'name': 'bidding.', 'age': 12, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}
{}
bidding.
12
1834479109552
1834479109552
封装
- 三个级别:public、protected、private
- 如果类中变量之前加了双下划线,则表示该变量是私有变量,实例不可访问
继承
- 任何类都有一个共同的父类object
- 子类可以继承父类中除私有成员外的所有
- 子类继承父类,实际是子类引用了父类中对应成员的地址,并不是真的赋值
- 子类调用父类的成员:super.成员 或者 父类名.成员
- 子类没有定义构造函数时,自动继承父类的构造函数
class Person():
name="xiaoming"
age=12
def sleep(self):
print("sleeping .....")
class Teacher(Person):
pass
t=Teacher()
print(t.name)
print(t.age)
xiaoming
12
单继承和多继承
- 单继承:每个类只能继承一个类
- 多继承:每个类允许继承多个类
优缺点:
-
单继承:
- 类的功能不能无限扩展
-
多继承:
- 功能无限扩展,但是关系混乱
多重继承导致的经典问题:
-
菱形继承:多个类继承自一个父类,这些子类又被同一个类继承
-
钻石继承:
-
关于多继承的MRO:
- MRO就是多继承中,用于保存继承顺序的一个列表
- MRO的计算原则:
- 子类永远在父类前面
- 如果多个父类,则根据继承语法括号内的顺序存放
- 如果多个类继承自同一个父类,则该父类只被存放一次
构造函数的调用顺序
- 子类先查找自己,没有就找父类的,直到找到为止
多态
- 多态就是同一个对象在不同情况下以不同的状态出现
- 是一种设计模式
Mixin设计模式
- 以多继承方式对类的功能进行扩展
类相关函数
issubclass:检测一个类是否是另一个类的子类
isinstance:检测对象是否是类的实例
hasattr:检测对象是否有某个成员
getattr:获取类的某个成员
setattr:设置类的成员
delattr:删除类的成员
类的内置属性
- __ dict __:字典的方式显示类的成员组成
- __ doc __:查看类的说明文档
- __ name __:获取类的名称或模块的名称
- __ bases __:获取类的所有父类,以元组的形式展现
类的常用魔术方法
- 特定的时刻自动触发的一些方法
- 方法名前后都有两个下划线
- 常用魔术方法:
- 操作类相关:
- __ init __:构造函数,类的初始化,类实例化的时候自动调用
- __ new __:类实例化的时候第一个被调用的方法,一般不用
- __ call __:类的实例以方法使用的时候,默认调用该方法,如果没有该方法,会报错
- __ str __:类的实例以字符串形式使用的时候,默认调用
- __ repr :类似于 str __
- 类描述符相关:
- __ set __:
- __ get __:
- __ delete __:
- 属性操作相关:
- __ getattr __:访问一个不存在的属性时触发
- __ setattr __:给不存在的属性赋值时触发,三个参数:self、attr、value,在该方法中不能直接对属性赋值,否则进入死循环;而是使用super.setattr()来赋值
- 运算类相关:
- __ gt __:进行大于判断的时候触发
- __ lt __:进行小于判断的时候触发
- 操作类相关:
类和对象的三种方法
- 实例方法:实例化对象才能使用
- 静态方法:通过类直接访问,实例也可以调用
- 类方法:通过类直接访问,实例也可以调用