python进阶 有关元类的派生

没有父类也可以直接根据super()使用父类方法?

一天看到有个群友问了这样一个问题:

为什么这个类没有看到继承于谁,但是在里面可以直接super?

在这个栏目中我们先不谈有关__setattr__魔术方法的具体作用(其实就是反射)和应用场景,就单纯谈为什么在这里可以凭空super。

举个简单的例子:

class Person:
    def __setattr__(self,name,value):
        print(f"setting attribute [{name}] to {value}")
        super().__setattr__(name,value)

看似没有集成任何类,为什么在这里我们直接可以super呢?其实相当于重写了Person类的父类的__setattr__方法,person类的父类是什么呢?这里我们需要了解元类的概念:(转载自b站阿岳同学)

实际上我们创建的类person本身就是object的派生类,所以当我们在person里直接super的时候,事实上使用的是object的魔术方法。

我们可以做个实验:

这里我们使用__base__查看父类能够看到class’object’,那么到底他是个什么呢?

在builtins.pyi中我们能一探究竟:

所以一切都很显然了,我们能够直接super原因是我们创造的class本身也是一种派生。

“一生二,二生三,三生万物“ —— 如果老子是个程序员,应该很喜欢python

Built with Hugo
Theme Stack designed by Jimmy