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

时间:2017-03-23 00:43:55

标签: python function postfix-notation

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

my_object_instance.mymethod()

我也知道您可以使用infix包定义中缀函数。

obj1 |func| obj2

我想要的是能够定义一个在后缀表示法中接受现有类型的函数。

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

if is_sorted(l): #dosomething

但如果可以写

,它可能更具惯用性
if l.is_sorted(): #dosomething

这可以在不创建自定义类型的情况下实现吗?

2 个答案:

答案 0 :(得分:1)

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

  

这可以在不创建自定义类型的情况下实现吗?

kindall mentioned代表什么,Python不允许它。但由于实现中的任何内容都不是真正的只读,您可以通过黑客攻击类字典来近似结果。

>>> 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。

此方法使用garbage collector interface通过类mappingproxy获取对底层字典的引用。通过引用计数进行垃圾收集是一个CPython实现细节。我只想说,这是危险/脆弱的,你不应该在任何严肃的代码中使用它。

如果你喜欢这种功能,你可能会喜欢ruby作为编程语言。

答案 1 :(得分:0)

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