面向对象编程
私有方法
- __private_method:
- 两个下划线开头
- 私有方法,只能在类的内部调用,不能在类的外部调用
class Site:
def __init__(self,name,url):
self,name=name#public
self.__url=url#private
def who(self):
类之间的关系
- is-a
- 继承
- Has-a
- 组合或关联
- 例:池塘里里面的各种生物
- Use-a
- 依赖
类的继承
- 基类(也叫父类)
- 被继承的类
- 派生类(也叫子类)
- 继承的类
class People:
def __init(self,name,age):
self.name=name
self.age=age
def speak(self)://这里的self不一定是People的
print(f"{self.name}说:我{self.age}岁。")
class Student(People):
def __int__(self,name,age,weight,grade):
People.__init__(self,name,age)
self.weight=weight
self.grade=grade
xm=Student(name="小明",age=10,weight=50,grade="三年级")//也可以直接输入值
xm.speak()//谁调了他,就是谁传了进去
方法的重写
子类会覆盖父类
多继承
- A(B,E)顺序不能变❕
- 表示A先继承B
- G自动继承object类
MRO算法
- 使用_ mro _来查询print(D.__mro _)
- 使用merge算法进行推导(不是重点,可以了解)
- 利用剪枝
- 左优先‼️
- 找如度为0的把它去掉
super()
- super()语法:
🌟考试会考
例
mro顺序
例
- 看的是mro的顺序
- c➡️a➡️b➡️base
例
- 理解self是谁
super0和类分别调用父类实例方法,区别在于super0后跟的方法不需要传self,父类调用实例方法,第一个参数需要传self
类的多态
只要有方法就可以调用
python不用定义接口,其他语言需要定义接口
- 不同的对象调用同一个接口,从而表现出不同的状态,称为多态
- 多态发生的条件:
- 继承:发生在父类子类之间
- 重写:子类重写父类方法
- 增加一个功能
多态的约束性方法
通过直接抛异常的方式
通过抽象基类(基类就是父类)和抽象方法来实现
类的Mixin设计模式
class Vehicle:
def fly(self):
print("I am flying",self)
class CivilAircraft(Vehicle) :
pass
class Helicopter(Vehicle):
pass
class Car(Vehicle):
pass
- car类继承vehicle类,但是car没有飞行功能
- 民航飞机与直升飞机重写fly代码冗余
- 一种设计模式
- 单独定义一个Mixin类
- 比喻:飞行只是飞机的一个增强属性
- python中没有接口一说
Mixin类实现多继承需要遵循的原则
不使用Mixin的弊端
类中的绑定方法(有同学问了讲的)
实例的绑定方法
类的绑定方法
通过classmethod装饰器,将绑定给实例的方法绑定到了类
谁调用了他就把谁传给cls
实例调用会把生成实例的类传给cls
类的非绑定方法
通过staticmethod装饰器,可以解除绑定关系,既不属于实例也不属于类
和普通函数相同,不用考虑自动传参
描述器(描述符)协议
父类为object,object里面已经实现了。因此可以直接调用a
-
- 动态生成
-
- M()成为描述器实例
- AA中把实例m当作自己的属性
数据描述器和非数据描述器
数据描述器也叫资料描述器
🌟getattr函数可以做反射
用字符串映射有没有这个方法
掌握:
什么叫描述器
数据描述器和非数据描述器
getattr
描述器用途
- vars和_ _dict _ _协议相同
描述器访问顺序(🌟重要)
- 只是定义了A类的时候就输出了前两行
判断类实例的函数
type和isinistance函数的区别
isinstance(obj,cls):判断obj是否是cls类·或者他的子类的实例
type(obj):获取实例obj的类型,不考虑继承关系
与__class _ _ 作用相同
二者等价
class A :
pass
type(A())
#结果是A
type(A)
#结果是<class 'type'>,type是生成类的类
元类
创建类的类
默认的元类:type
要创建一个class对象,type()函数依次传入3个参数:
通过继承type创建元类
- 什么都不用做都可以输出前两行,只是定义就可以(🌟,考试没准就考)
- 元类是生成类,
- 什么都不用做都可以输出前两行,只是定义就可以(🌟,考试没准就考)
- object可以指这三种类型,具体情况具体分析