我知道如果你创建自己的对象,你可以在该对象上定义自己的方法。
my_object_instance.mymethod()
我也知道您可以使用infix包定义中缀函数。
obj1 |func| obj2
我想要的是能够定义一个在后缀表示法中接受现有类型的函数。
例如,给定列表l
,我们可能想要检查它是否已排序。定义典型函数可能会给我们
if is_sorted(l): #dosomething
但如果可以写
,它可能更具惯用性if l.is_sorted(): #dosomething
这可以在不创建自定义类型的情况下实现吗?
答案 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语言),并且不允许修改类字典。您必须将它们子类化以根据需要添加方法。