python中的对象继承

Posted

技术标签:

【中文标题】python中的对象继承【英文标题】:object inheritance in python 【发布时间】:2015-01-20 18:21:45 【问题描述】:

今天早上我提出了一个奇怪的理想。众所周知,在 python 中,一切都是对象,包括类和函数。

不要问我为什么要这样做。这是一个玩python的实验。我知道它是从实例继承的。

我们试试吧:

kk=dict()
print dir(dict)
print dir(kk)
output of them are same

class yy(dict): pass ---ok
class zz(kk)  : fail ---error
TypeError: Error when calling the metaclass bases
dict expected at most 1 arguments, got 3

谁能深入解释我为什么收到此错误消息?

再次。如果可能,请解释一下python是如何输出这个错误信息的?

【问题讨论】:

zz 正在尝试从 instance 继承。对于fail 上的NameError,它甚至还远远不够。 查看python文档元类是如何工作的。 【参考方案1】:

这是因为您需要从type 继承。 dict 是一个类型,dict() 不是,它是一个字典的实例。 types 的类型是 type,并且所有类型的实例都是 type 类型 - 它们的实例不是。

>>> type(dict)
<class 'type'>
>>> type(dict())
<class 'dict'>
>>> isinstance(dict, type)
True
>>> isinstance(dict(), type)
False

【讨论】:

【参考方案2】:

您收到该特定错误的原因与元类有关。任何类的元类都必须匹配或子类化每个类的元类(如果它是基类)(以使“is-a”继承规则起作用)。您没有提供元类,因此 python 默认使用单个基类的类型。当基类是 dict 时,元类是类型(默认)并且一切正常。当基类为 kk 时,Python 尝试使用 dict 作为元类 - 问题在于,dict 不是 元类。错误说'dict不遵循元类api'。

【讨论】:

以上是关于python中的对象继承的主要内容,如果未能解决你的问题,请参考以下文章

47Python面向对象中的继承有什么特点?

如何使类继承自Python中的任何对象

一文带你了解 Python 中的继承知识点

python中的类的创建使用和继承

为啥从 Python 中的对象继承,在不指定父对象时更改 __dict__ 的类型不会? [复制]

如何在Python中的for循环内创建对象列表而不继承属性值[重复]