在下面的属性列表中,
>>> dir(object)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
__eq__
,__ne__
& __hash__
未显示为属性。它们是元类type
>>> dir(type)
[... '__eq__', .... '__hash__', ... '__ne__', ...]
>>>
且object
与is-a
type
关系中
>>> issubclass(object, type)
False
>>> issubclass(type, object)
True
但是,我认为这些属性属于object
,
>>> object.__eq__
<method-wrapper '__eq__' of type object at 0x905b80>
>>> object.__ne__
<method-wrapper '__ne__' of type object at 0x905b80>
>>> object.__hash__
<slot wrapper '__hash__' of 'object' objects>
>>>
这允许,
class X(object):
pass
class X
覆盖这些属性。
问题:
这些属性是object
吗?
答案 0 :(得分:2)
type
中的方法定义了一个类的行为方式,object
中的方法实现了实例的行为方式。
使用object
的子类:
class X(object):
pass
然后
X == X
将致电type.__eq__(X, X)
可是:
X() == X()
将致电object.__eq__(X, X)
至少只要你不覆盖这些magic methods(直接在你的X
或为X
定义自己的元类时)。
如果你“去元”,那么重要的是要知道元类是类到类的实例:
>>> isinstance(object, type) # class & metaclass
True
>>> isinstance(X(), X) # instance & class
True
答案 1 :(得分:1)
它们是数据模型定制的一部分,称为“魔术方法”,您必须将它们视为与python功能交互的接口。 以下是与此相关的所有documentation。