Python扩展方法

问题描述 投票:22回答:6

好吧,在C#中,我们有类似的东西:

public static string Destroy(this string s) { 
    return "";
}

因此,基本上,当您有字符串时,您可以执行:

str = "This is my string to be destroyed";
newstr = str.Destroy()
# instead of 
newstr = Destroy(str)

现在这很酷,因为我认为它更具可读性。 Python有类似的东西吗?我的意思是不要这样写:

x = SomeClass()
div = x.getMyDiv()
span = x.FirstChild(x.FirstChild(div)) # so instead of this

我想写:

span = div.FirstChild().FirstChild() # which is more readable to me

有任何建议吗?

python extension-methods
6个回答
19
投票

您可以直接直接修改类,有时也称为猴子修补。

def MyMethod(self):
      return self + self

MyClass.MyMethod = MyMethod
del(MyMethod)#clean up namespace

我不是100%确定您可以在诸如str这样的特殊类上执行此操作,但是对于您定义的用户类来说就可以了。

更新

您在评论中证实了我的怀疑,这对于像str这样的内置文件是不可能的。在这种情况下,我认为此类类没有C#扩展方法的类似物。

最后,在C#和Python中,这些方法的便利性都会带来风险。使用这些技术可以使代码更易于理解和维护。


3
投票

您可以在forbidden fruit的帮助下通过猴子补丁来更改内置类。

但是安装禁果需要C编译器

不受限制的环境,所以它可能无法工作,或者需要费劲才能在Google App Engine,Heroku等上运行。

此库针对土耳其语unicode大写/小写问题更改了Python 2.7中i,I类的行为。

# -*- coding: utf8 -*-
# Redesigned by @guneysus

import __builtin__
from forbiddenfruit import curse

lcase_table = tuple(u'abcçdefgğhıijklmnoöprsştuüvyz')
ucase_table = tuple(u'ABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZ')


def upper(data):
    data = data.replace('i',u'İ')
    data = data.replace(u'ı',u'I')
    result = ''
    for char in data:
        try:
            char_index = lcase_table.index(char)
            ucase_char = ucase_table[char_index]
        except:
            ucase_char = char
        result += ucase_char
    return result

curse(__builtin__.unicode, 'upper', upper)
class unicode_tr(unicode):
    """For Backward compatibility"""
    def __init__(self, arg):
        super(unicode_tr, self).__init__(*args, **kwargs)

if __name__ == '__main__':
    print u'istanbul'.upper()

1
投票

您可以按照以下方式完成您所要求的操作:


1
投票

您可以通过以下context manager很好地实现这一点,该方法将方法添加到上下文块内的类或对象,然后将其删除:


-4
投票

C#实现了扩展方法,因为它缺少一流的功能,Python拥有它们,并且它是在Python中的不同类之间“包装”通用功能的首选方法。


-10
投票

[一周后,我有一个最接近我想要的解决方案。解决方案包括使用getattr__getattr__。这是对感兴趣的人的示例。

© www.soinside.com 2019 - 2024. All rights reserved.