【发布时间】:2021-03-21 22:37:49
【问题描述】:
我正在加深对 Python 的理解,最近我了解到函数必须是类(?),并且 def func(): 只是实例化了 function 类的对象。老实说,当我创建func 的属性时,我大吃一惊。
潜伏在dir(func) 中发现.__eq__ 等特殊方法确实都是继承的,想玩弄一下:
def func(n):
print(n)
def __eq__(self,func2):
print('hello')
但是,它不起作用:
>>> func.__eq__(print)
NotImplemented
为函数重载相等运算符的正确方法是什么?如果没有正确的 class 定义,我看不到如何重载它。
【问题讨论】:
-
“最近我明白函数必须是类” - 我不知道你是如何或从哪里得到这个想法的,但这是错误的。函数是类的实例,就像任何其他 Python 对象(包括类本身)一样,但函数不是类。
-
谢谢你们,你们其实都是对的,我明白发生了什么。我尝试的是
import types,def equality_mine():我自己的新相等运算符,以及types.FunctionType.__eq__ = equality_mine使用它来重载函数相等运算符:TypeError: can't set attributes of built-in/extension type 'function'。我想有人在我之前考虑过。 -
您可以通过在其中定义
__call__()特殊方法来创建自己的类,其实例可调用。这样的类可以有自己的__eq__()比较方法,就像其他类一样。你甚至可以“注册”你的类,这样对isinstance()的调用就会认为它的实例与types.FunctionType的实例相同。换句话说,您自己的类的实例(几乎)“在功能上”等同于内置函数。;¬) -
我认为您的意思是“覆盖”而不是“重载”
标签: python function class comparison-operators