python抽象基类

python抽象基类,第1张

有时,我们抽象出一个基类,知道要有哪些方法,但只是抽象方法,并不实现功能,只能继承,

而不能被实例化,但子类必须要实现该方法。

 但是注意,实例化Base,仍然是报错的,因为抽象基类只能继承而不能实例化,子类要实例化

必须先实现该方法。

为了理解抽象基类,你可以这样想,我们有水果这个抽象基类,有苹果,香蕉,桃子类等,但你永远只能

吃得到苹果,桃子这些,而不能吃到所谓的“水果”。

参考

>

首先来看一个函数间的调用

类方法:

执行结果:

metaclass能有什么用处,先来个感性的认识:

11 在wiki上面,metaclass是这样定义的:In object-oriented programming,

a metaclass is a class whose instances are classes

Just as an ordinary class defines the behavior of certain objects,

a metaclass defines the behavior of certain classes and their instances

也就是说metaclass的实例化结果是类,而class实例化的结果是instance。我是这么理解的:

metaclass是类似创建类的模板,所有的类都是通过他来create的(调用 new ),这使得你可以自由的控制

创建类的那个过程,实现你所需要的功能。

当然你也可以用函数的方式(下文会讲)

41 用类的形式

411 类继承于type, 例如: class Meta(type):pass

412 将需要使用metaclass来构建class的类的 metaclass 属性(不需要显示声明,直接有的了)赋值为Meta(继承于type的类)

42 用函数的形式

421 构建一个函数,例如叫metaclass_new, 需要3个参数:name, bases, attrs,

name: 类的名字

bases: 基类,通常是tuple类型

attrs: dict类型,就是类的属性或者函数

422 将需要使用metaclass来构建class的类的 metaclass 属性(不需要显示声明,直接有的了)赋值为函数metaclas_new

51 basic

metaclass的原理其实是这样的:当定义好类之后,创建类的时候其实是调用了type的 new 方法为这个类分配内存空间,创建

好了之后再调用type的 init 方法初始化(做一些赋值等)。所以metaclass的所有magic其实就在于这个 new 方法里面了。

说说这个方法: new (cls, name, bases, attrs)

cls: 将要创建的类,类似与self,但是self指向的是instance,而这里cls指向的是class

name: 类的名字,也就是我们通常用类名 name 获取的。

bases: 基类

attrs: 属性的dict。dict的内容可以是变量(类属性),也可以是函数(类方法)。

所以在创建类的过程,我们可以在这个函数里面修改name,bases,attrs的值来自由的达到我们的功能。这里常用的配合方法是

getattr和setattr(just an advice)

下面实现python中在一个类中调用另一个类的函数方法

或者下面来一个号理解的例子

执行结果:

先来介绍内部类与外部类是什么?

看源码解析:

内部类调用外部类的类属性和类方法

参考文献1

参考文献2

参考文献3

def __mro_entries__(self, bases):

如果在类定义中出现的基类不是 type 的实例, 则使用 __mro_entries__ 方法对其进行搜索

当找到结果时, 它会以原始基类元组做参数进行调用

此方法必须返回类的元组以替代此基类被使用

元组可以为空, 在此情况下原始基类将被忽略

__mro_entries__获取origin变量

__class_getitem__返回一个实例化的

当Python作为系统服务时,可能无法获取系统变量。这是因为服务程序在启动时,并没有像一般程序一样把系统变量加载到内存里,所以Python也无法使用它们。如果要解决此问题,可以尝试在服务启动前显式地加载系统变量,然后才启动Python服务。

以上就是关于python抽象基类全部的内容,包括:python抽象基类、Python:多态、鸭子模型和抽象基类、核心解密Python函数在(类与函数之间)和(类与类之间)互相调用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9715489.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存