无法找到更好地标题的方法,随意纠正.
我是Python的新手,目前正在尝试使用该语言.我注意到所有内置类型都不能与其他成员一起扩展.我想例如each在list类型中添加一个方法,但那会不可能.我意识到它是出于效率原因而设计的,并且大多数内置类型都是用C实现的.
好吧,我发现重写此行为的原因之一是定义一个新类,该类扩展list但不执行任何操作.然后我可以将变量分配list给那个新类,每次我想实例化一个新列表时,我都会使用list构造函数,就像它用来创建原始list类型一样.
class MyList(list):
def each(self, func):
for item in self:
func(item)
list = MyList
my_list = list((1,2,3,4))
my_list.each(lambda x: print(x))
Run Code Online (Sandbox Code Playgroud)
输出:
1
2
3
4
Run Code Online (Sandbox Code Playgroud)
当然,这个想法可以通过定义获取构建类型的方法并返回扩展该类型的类来概括.此外,原始list变量可以保存在另一个变量中以保持对它的访问.
我现在面临的唯一问题是,当你list通过它的文字形式(即[1,2,3,4])实例化它时,它仍将使用原始列表构造函数(或者它是什么?).有没有办法覆盖这种行为?如果答案是否定的,您是否知道其他一些方法可以让用户扩展内置类型?(就像javascript允许扩展内置原型).
我发现内置插件的这种限制(无法向其添加成员)是Python的一个缺点,使其与其他用户定义的类型不一致......总的来说我真的很喜欢这种语言,我真的不明白为什么这样绝对是必要的.
Vee*_*rac 19
这是Python的一个尽职尽责的选择.
首先,关于内置类型的修补,这主要是设计决策,其次只是优化.我从潜伏在Python邮件列表上的很多东西中学到了对内置类型进行修补,虽然对于小脚本很有用,但对于任何更大的脚本都没有好处.
例如,图书馆对类型做出了某些假设.如果鼓励扩展默认类型,许多库最终会互相争斗.它也会阻止制作新类型 - deque是deque,有序集是有序集,字典是字典,应该是那样.
文字语法是特别重要的一点.如果你不能保证这[1, 2, 3]是一个清单,你能保证什么?如果人们可以改变这些行为,就会产生如此全球性的影响,从而破坏许多代码的稳定性.有理由不鼓励goto和全局变量.
还有就是我一个特定的黑客很喜欢,虽然.当你看到r"hello",这似乎是一个扩展的文字形式.
那为什么不r[1, 2, 3]呢?
class ListPrefixer:
def __init__(self, typ):
self.typ = typ
def __getitem__(self, args):
return self.typ(args)
class MyList(list):
def each(self, func):
return MyList(func(x) for x in self)
e = ListPrefixer(MyList)
e[1, 2, 3, 4].each(lambda x: x**2)
#>>> [1, 4, 9, 16]
Run Code Online (Sandbox Code Playgroud)
最后,如果你真的想做深度AST黑客攻击,请查看MacroPy.