是__eq __,__ ne__,__ hash__对象类型的属性?

时间:2017-06-02 11:47:23

标签: python

在下面的属性列表中,

>>> 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__', ...]
>>>

objectis-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吗?

2 个答案:

答案 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