我一直在阅读有关元类的内容,但在type
和object
课程中我迷路了。
我知道它们位于层次结构的顶层,它们是用C代码实现的。
我也了解type
继承自object
,而object
是type
的实例。
在我发现的answers之一中,有人说 - 关于object-type
关系 - :
这种相互继承通常是不可能的,但这就是Python中这些基本类型的方式:它们违反了规则。
我的问题是为什么以这种方式实现,这种实现的目的是什么?它解决了什么问题/这个设计有什么好处?难道只是type
或只是object
类位于每个类继承的层次结构的顶部吗?
最后,来自object
的子类与来自type
的子类之间是否有任何区别,以及何时我想使用另一个?{/ p>
class Foo(object):
pass
VS
class Foo(type):
pass
答案 0 :(得分:7)
object
和type
之间没有交叉继承。事实上,交叉继承是不可能的。
# 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
的实例。这意味着object
和type
都是彼此的实例。无论您所关联的其他答案是什么,这都不是“继承”。该关系与int
和1
之间的关系相同:1
生成的对象是int
的实例。这里的怪癖是object
和type
都是彼此的实例。
从Python的角度来看,这两个意味着不同的东西。 object
类型具有本体论角色:一切都是对象(没有其他东西存在)。所以说type
是一个对象只是意味着它就存在就Python的模型而言。另一方面,object
是所有对象的基本类型,因此它是一种类型。作为一种类型,它必须是type
的一个实例,它与任何其他对象一样是object
的实例。
就解释器的实现而言:type
是object
的实例这一事实很方便,因为它维护“一切都是对象”,这对于例如{在关机时释放对象。 object
是type
的实例这一事实很有用,因为它可以直接确保它的行为与其他类型对象一样。