代码之家  ›  专栏  ›  技术社区  ›  Bananach

为什么我不能分配'cls__hash_;=id`

  •  2
  • Bananach  · 技术社区  · 6 年前

    我本希望它能工作(在Python 3.6中),

    class A:
        __hash__ = id
    A().__hash__()
    

    但我明白

    TypeError: id() takes exactly one argument (0 given)
    

    惊人地

    def my_id(self):
        return id(self)
    class A:
        __hash__ = my_id
    A().__hash__()
    

    一切如愿。

    1 回复  |  直到 6 年前
        1
  •  8
  •   bruno desthuilliers    6 年前

    id 是一种 builtin_function_or_method (这是一个内置于运行时中的函数-),出于实际原因(主要是优化),它没有实现 descriptor 协议就像python函数一样,所以 A().__hash__ 下定决心 身份证件 功能本身,而不是 method 对象包装函数。

    对于大多数内置函数FWIW,您将观察到相同的行为:

    >>> type(len)
    <class 'builtin_function_or_method'>
    >>> len.__get__
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'builtin_function_or_method' object has no attribute '__get__'
    >>> 
    >>> type(all)
    <class 'builtin_function_or_method'>
    >>> all.__get__
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'builtin_function_or_method' object has no attribute '__get__'
    >>> type(abs)
    <class 'builtin_function_or_method'>
    >>> abs.__get__
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'builtin_function_or_method' object has no attribute '__get__'
    >>> type(isinstance)
    <class 'builtin_function_or_method'>
    >>> isinstance.__get__
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'builtin_function_or_method' object has no attribute '__get__'
    

    等

    推荐文章