一天看到有个群友问了这样一个问题:
为什么这个类没有看到继承于谁,但是在里面可以直接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