Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中定义后缀函数?_Python_Function_Postfix Notation - Fatal编程技术网

如何在Python中定义后缀函数?

如何在Python中定义后缀函数?,python,function,postfix-notation,Python,Function,Postfix Notation,我知道,如果您创建自己的对象,您可以在该对象上定义自己的方法 my\u object\u instance.mymethod() 我还知道你可以用这个包定义中缀函数 obj1 | func | obj2 我想要的是能够定义一个接受后缀符号中现有类型的函数 例如,给定一个列表l,我们可能需要检查它是否已排序。定义一个典型的函数可能会给我们 if is_sorted(l): #dosomething 但如果你能写,它可能会更地道 if l.is_sorted(): #dosomething 在不

我知道,如果您创建自己的对象,您可以在该对象上定义自己的方法

my\u object\u instance.mymethod()

我还知道你可以用这个包定义中缀函数

obj1 | func | obj2

我想要的是能够定义一个接受后缀符号中现有类型的函数

例如,给定一个列表
l
,我们可能需要检查它是否已排序。定义一个典型的函数可能会给我们

if is_sorted(l): #dosomething
但如果你能写,它可能会更地道

if l.is_sorted(): #dosomething

在不创建自定义类型的情况下,这是可能的吗?

Python通常不允许对内置类型进行猴子补丁,因为常见的内置类型不是用Python编写的(而是用C编写的),也不允许修改类字典。您必须对它们进行子类化,以便根据需要添加方法。

正确的方法是继承,通过继承
列表创建自定义类型并添加新功能。Monkeypatching不是Python的优势。但既然你特别问:

不创建自定义类型就可以这样做吗

无论如何,Python不允许这样做。但由于实现中没有真正的只读内容,因此可以通过在类dict中进行黑客攻击来近似结果

>>> def is_sorted(my_list):
...     return sorted(my_list) == my_list
... 
>>> import gc
>>> gc.get_referents(list.__dict__)[0]['is_sorted'] = is_sorted
>>> [1,2,3].is_sorted()
True
>>> [1,3,2].is_sorted()
False
新的“方法”将出现在
vars(list)
中,名称将出现在
dir([])
中,并且在应用monkeypatch之前创建的实例上也可用

这种方法使用通过类获取对底层dict的引用。通过引用计数进行垃圾收集是CPython实现的一个细节。可以说,这是危险的/脆弱的,您不应该在任何严肃的代码中使用它


如果您喜欢这种特性,您可能会喜欢作为一种编程语言

如果您想要的是一个接受类型作为参数的函数,那么您不需要做任何事情;类型是pythonPostfix中的第一类对象,表示法是另外一回事。谢谢!这太完美了