面向对象之魔法方法及元类

昨日内容回顾

  • 类的派生的应用

    在需要对原有的方法进行个性化扩展时,需要应用到方法的派生。

    在进行派生时,需要先定位到需要派生的的功能,添加个性化的功能后,使用super调用原方法。

  • 面向对象之封装

    封装即对数据和功能进行封装,形成对象。

    隐藏即对类中的名称进行隐蔽处理,形式为在该名称前加上双下划线,使对象无法直接通过点的方式调用。对名称的隐藏实质上是在该名称的前面加上单下划线及类名。

    被隐藏的对象无法被直接调用,但是可以在定义时规定相应的接口对该名称对应的数据进行操作。

    伪装即对函数内的方法进行装饰,使其看起来像类内的名称。需要使用property装饰器,被装饰的函数除了self之外不能有其他的参数。

  • 面向对象之多态

    同一类的同一方法在不同的对象中可以有不同的表现形式,这就是对象的多态性。

  • 面向对象之反射

    反射为我们提供了使用字符串访问对象中名称的方式,常用的方法有:hasattr() getattr() setattr() delattr()

今日内容概要

  • 面向对象之魔法方法
  • 面向对象之元类
  • 干涉类的生成
  • 干涉对象的生成
  • 魔法方法之双下new
  • 设计模式简介

今日内容详细

面向对象之魔法方法

魔法方法即在进行特定操作时自动触发的方法。常见的魔法方法有:

__init__()  # 在产生类的对象时自动触发
__call__()  # 在使用对象加括号时自动触发
__str__()  # 在执行打印操作时自动触发
__getattr__()  # 在调用类中不存在的名称时自动触发
__getattribute__()  # 在调用类中的名称时自动触发,优先级高于__getattr__()
__setattr__()  # 在为对象中的名称进行赋值时自动触发
__enter__()  # 在对象作为with上下文管理的对象开始时自动触发
__exit__()  # 在对象作为with上下文管理的对象子代码运行结束后自动触发

面向对象之元类

元类即为解释器使用者生成自定义类的最原始的类,即type类。继承了type的类也可以称为元类。

python中一切皆对象,因此元类生成新类与类生成对象的过程类似,只是规模不同。元类产生的类对象默认可以加括号调用生成对象,而生成的对象想要加括号调用必须手动在生成它的类中定义双下call方法。

干涉类的形成

想要干涉类的形成需要在形成的阶段进行操作,即对双下init方法的运行进行干涉。

在pycharm中我们无法直接访问到type类的源代码,因此我们只能通过用继承type的类作为元类,然后对继承后的类的双下init方法进行派生,从而达到我们想要的目的。

指定类的元类的方法为,在定义类的阶段,类名后加括号,括号内对metaclass关键字赋值。

干涉对象的形成

对象的形成是使用类加括号的形式实现的,其本质是调用了其元类中的双下call方法。

与干涉类的形式的方法类似,使用metaclass关键字赋值改变其元类,在我们自己定义的元类中,对双下call函数进行装饰,装饰完成后,使用super调用原来的双下call方法,完成对象的生成。

魔法方法之双下new

def __new__(cls, *args, **kwargs): pass

双下new方法一般存在于元类type中,生成新的对象时,会调用双下new方法先形成一个新的空对象,然后用可变长形参接收传入的参数,最后调用类定义时的双下init函数按照规则对名称进行赋值。

设计模式简介

设计模式分为三种类型,共23种。

创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。

结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。

行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)、访问者模式

posted @ 2022-11-08 20:13  Akazukis  阅读(27)  评论(0)    收藏  举报