好吧,在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
有任何建议吗?
您可以直接直接修改类,有时也称为猴子修补。
def MyMethod(self):
return self + self
MyClass.MyMethod = MyMethod
del(MyMethod)#clean up namespace
我不是100%确定您可以在诸如str这样的特殊类上执行此操作,但是对于您定义的用户类来说就可以了。
更新
您在评论中证实了我的怀疑,这对于像str这样的内置文件是不可能的。在这种情况下,我认为此类类没有C#扩展方法的类似物。
最后,在C#和Python中,这些方法的便利性都会带来风险。使用这些技术可以使代码更易于理解和维护。
您可以在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()
您可以按照以下方式完成您所要求的操作:
您可以通过以下context manager很好地实现这一点,该方法将方法添加到上下文块内的类或对象,然后将其删除:
C#实现了扩展方法,因为它缺少一流的功能,Python拥有它们,并且它是在Python中的不同类之间“包装”通用功能的首选方法。
[一周后,我有一个最接近我想要的解决方案。解决方案包括使用getattr
和__getattr__
。这是对感兴趣的人的示例。