Python3中的子类型与对象的子类化

时间:2018-03-07 01:00:38

标签: python inheritance metaclass

我一直在阅读有关元类的内容,但在typeobject课程中我迷路了。

我知道它们位于层次结构的顶层,它们是用C代码实现的。 我也了解type继承自object,而objecttype的实例。

在我发现的answers之一中,有人说 - 关于object-type关系 - :

  

这种相互继承通常是不可能的,但这就是Python中这些基本类型的方式:它们违反了规则。

我的问题是为什么以这种方式实现,这种实现的目的是什么?它解决了什么问题/这个设计有什么好处?难道只是type或只是object类位于每个类继承的层次结构的顶部吗?

最后,来自object的子类与来自type的子类之间是否有任何区别,以及何时我想使用另一个?{/ p>

class Foo(object):
    pass

VS

class Foo(type):
    pass

2 个答案:

答案 0 :(得分:7)

objecttype之间没有交叉继承。事实上,交叉继承是不可能的。

# A type is an object
isinstance(int, object) # True

# But an object is not necessarily a type
isinstance(object(), type) # False

Python中的真实情况是......

一切 一个对象

绝对一切,object是唯一的基本类型。

isinstance(1, object) # True
isinstance('Hello World', object) # True
isinstance(int, object) # True
isinstance(object, object) # True

所有 类型

所有内容都有内置类型或用户定义类型,并且可以使用type获取此类型。

type(1) # int
type('Hello World') # str
type(object) # type

并非一切都是类型

那个是相当明显的

isinstance(1, type) # False
isinstance(isinstance, type) # False
isinstance(int, type) # True

type是它自己的类型

这是特定于type的行为,并且对于任何其他类都不具有可再现性。

type(type) # type

换句话说,type是Python中唯一的对象

type(type) is type # True

# While...
type(object) is object # False

这是因为type是唯一的内置元类。元类只是一个类,但它的实例也是类本身。所以在你的例子中......

# This defines a class
class Foo(object):
    pass

# Its instances are not types
isinstance(Foo(), type) # False

# While this defines a metaclass
class Bar(type):
    pass

# Its instances are types
MyClass = Bar('MyClass', (), {})

isinstance(MyClass, type) # True

# And it is a class
x = MyClass()

isinstance(x, MyClass) # True

答案 1 :(得分:2)

在Python中,一切都是对象。每个对象都有一个类型。事实上,对象的类型也是一个对象,因此也必须有自己的类型。类型具有称为type的特殊类型。这(与任何其他类型一样)是一个对象,因此是object的实例。

每个对象都是object的实例,包括任何对象的类型。因此int是一个对象,因此str以及1'asd'等更明显的示例。您可以在Python中引用或分配给变量的任何内容都是object的实例。

由于object是一种类型,因此它是type的实例。这意味着objecttype都是彼此的实例。无论您所关联的其他答案是什么,这都不是“继承”。该关系与int1之间的关系相同:1生成的对象是int的实例。这里的怪癖是objecttype都是彼此的实例。

从Python的角度来看,这两个意味着不同的东西。 object类型具有本体论角色:一切都是对象(没有其他东西存在)。所以说type是一个对象只是意味着它就存在就Python的模型而言。另一方面,object是所有对象的基本类型,因此它是一种类型。作为一种类型,它必须是type的一个实例,它与任何其他对象一样是object的实例。

就解释器的实现而言:typeobject的实例这一事实很方便,因为它维护“一切都是对象”,这对于例如{在关机时释放对象。 objecttype的实例这一事实很有用,因为它可以直接确保它的行为与其他类型对象一样。