Extension methods in Python

后端 未结 6 972
没有蜡笔的小新
没有蜡笔的小新 2021-01-31 01:55

Does Python have extension methods like C#? Is it possible to call a method like:

MyRandomMethod()

on existing types like int?

6条回答
  •  梦毁少年i
    2021-01-31 02:43

    The following context manager adds the method like Forbidden Fruit would without the limitations of it. Besides that it has the additional benefit of removing the extension method afterwards:

    class extension_method:
    
        def __init__(self, obj, method):
            method_name = method.__name__
            setattr(obj, method_name, method)
            self.obj = obj
            self.method_name = method_name
    
        def __enter__(self):
            return self.obj
    
        def __exit__(self, type, value, traceback):
            # remove this if you want to keep the extension method after context exit
            delattr(self.obj, self.method_name)
    
    

    Usage is as follows:

    class C:
        pass
    
    def get_class_name(self):
        return self.__class__.__name__
    
    with extension_method(C, get_class_name):
        assert hasattr(C, 'get_class_name') # the method is added to C
        c = C()
        print(c.get_class_name()) # prints 'C'
    
    assert not hasattr(C, 'get_class_name') # the method is gone from C
    

提交回复
热议问题