class Base(type):
print('This is Base.')
def __new__(cls, name, bases, attrs):
print(cls)
return type(name, bases, attrs)
#return type.__new__(cls, name, bases, attrs)
class Parent(object, metaclass=Base):
print('This is Parent.')
class Child(Parent):
print('This is Child.')
输出结果如下:
- This is Base.
- This is Parent.
- <class '
__main__.Base'> - This is Child.
这个结果我还可以理解,由上往下执行,走到 Parent 的时候,由元类__new__方法中的 type 方法生成一个新类,返回给 Parent,下面的 Child 继承了 Parent 这个类。
为什么当把return type(name, bases, attrs)换成return type.__new__(cls, name, bases, attrs)的时候会导致下面的结果?
- This is Base.
- This is Parent.
- <class '
__main__.Base'> - This is Child.
- <class '
__main__.Base'>
我知道复写type.__new__方法,产生的结果是 Base 这个类的一个实例,但同时这个实例也是一个类对象,
但是我不太理解的是为什么这里 Child 会再次执行 Base 里面的__new__方法,为什么上面(type())的不执行?
查阅了很多资料,国内的论坛好像很少有讲type.__new__和type()的区别的,还是我姿势不对?
StackOverflow 和 Python3.7 文档我也看了相关的内容,能理解type.__new__和type()的区别了,但是不太明白涉及到这种多重继承的时候type.__new__和type()为什么会有差异。
还是我理解错了?希望有人能帮我解答一下,谢谢!!
总结一下就是:
- 采用 type()的写法,会导致 Child 仅仅继承 Parent 类的属性和方法。
- 采用
type.__new__()的写法,会使 Child 类是由 Base 生成的,会覆盖掉 Parent 类中由 Base 生成的部分。
我想问一下为什么会导致这种差异。