Python-面向对象编程


面向对象编程

私有方法

  • __private_method:
    • 两个下划线开头
    • 私有方法,只能在类的内部调用,不能在类的外部调用
class Site:
  def __init__(self,name,url):
    self,name=name#public
    self.__url=url#private
    
  def who(self):
    

类之间的关系

  • is-a
    • 继承
  • Has-a
    • 组合或关联
    • image-20221109160623400
    • 例:池塘里里面的各种生物
  • Use-a
    • 依赖
    • image-20221109160605227

image-20221102162738720

类的继承

  • 基类(也叫父类)
    • 被继承的类
  • 派生类(也叫子类)
    • 继承的类
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()//谁调了他,就是谁传了进去

方法的重写

子类会覆盖父类

多继承

image-20221102163858056

  • A(B,E)顺序不能变❕
    • 表示A先继承B
  • G自动继承object类
MRO算法
  • 使用_ mro _来查询print(D.__mro _)
  • 使用merge算法进行推导(不是重点,可以了解)

image-20221102164627442

  • 利用剪枝
    • 左优先‼️
  • 找如度为0的把它去掉

super()

  • super()语法:

🌟考试会考

image-20221102170836759

  • image-20221102171352784

    • mro顺序

    • image-20221102171435329

    • image-20221102172330714
    • 看的是mro的顺序
    • c➡️a➡️b➡️base
    • 理解self是谁
    • image-20221102172943838
  • super0和类分别调用父类实例方法,区别在于super0后跟的方法不需要传self,父类调用实例方法,第一个参数需要传self

类的多态

只要有方法就可以调用

python不用定义接口,其他语言需要定义接口

  • 不同的对象调用同一个接口,从而表现出不同的状态,称为多态
  • 多态发生的条件:
    • 继承:发生在父类子类之间
    • 重写:子类重写父类方法
  • 增加一个功能
    • image-20221109164508768

多态的约束性方法

  • 通过直接抛异常的方式

    • image-20221109170156871
  • 通过抽象基类(基类就是父类)和抽象方法来实现

    • image-20221109170736639

类的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代码冗余

image-20221109162525708

  • 一种设计模式
  • 单独定义一个Mixin类
    • 比喻:飞行只是飞机的一个增强属性
  • python中没有接口一说

Mixin类实现多继承需要遵循的原则

image-20221109163244822

不使用Mixin的弊端

image-20221109163332608

类中的绑定方法(有同学问了讲的)

实例的绑定方法

类的绑定方法

通过classmethod装饰器,将绑定给实例的方法绑定到了类

谁调用了他就把谁传给cls

实例调用会把生成实例的类传给cls

类的非绑定方法

通过staticmethod装饰器,可以解除绑定关系,既不属于实例也不属于类

和普通函数相同,不用考虑自动传参

描述器(描述符)协议

  • image-20221109171624111

  • 父类为object,object里面已经实现了。因此可以直接调用a

  • image-20221116164118563

    • image-20221116164222818
      • 动态生成
  • image-20221109172711106

    • M()成为描述器实例
    • AA中把实例m当作自己的属性

数据描述器和非数据描述器

数据描述器也叫资料描述器

🌟getattr函数可以做反射

用字符串映射有没有这个方法

掌握:

什么叫描述器

数据描述器和非数据描述器

getattr

描述器用途

  • image-20221116164924867
  • vars和_ _dict _ _协议相同

描述器访问顺序(🌟重要)

image-20221116172952732

  • 只是定义了A类的时候就输出了前两行

image-20221116174035448

判断类实例的函数

  • type和isinistance函数的区别

    • isinstance(obj,cls):判断obj是否是cls类·或者他的子类的实例

    • type(obj):获取实例obj的类型,不考虑继承关系

      • 与__class _ _ 作用相同

      • 二者等价

        image-20221116161439404

class A :
  pass

type(A())
#结果是A

type(A)
#结果是<class 'type'>,type是生成类的类
  • 元类

    • 创建类的类

      • 默认的元类:type

      • 要创建一个class对象,type()函数依次传入3个参数:

        image-20221116161829260

    • 通过继承type创建元类

      image-20221116163027470

      • 什么都不用做都可以输出前两行,只是定义就可以(🌟,考试没准就考)
        • image-20221116162459971
        • 元类是生成类,

image-20221116163626790

  • object可以指这三种类型,具体情况具体分析

文章作者: zxn
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 zxn !
  目录