我对Python很新,目前正在尝试使用这种语言..我注意到所有内置类型都无法与其他成员进行扩展..我想举个例子来添加每个方法到列表类型,但是这是不可能的.我意识到这是为了效率原因而设计的,大多数内置类型都是在C中实现的.
那么,为什么我发现要重写这个行为就是定义一个新的类,它扩展了列表,但是没有做任何事情.然后,我可以将变量列表分配给该新类,并且每次要实例化一个新列表时,我将使用列表构造函数,就像将用于创建原始列表类型一样.
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))
输出:
1 2 3 4
这个想法可以通过定义一个方法获得一个构建它的类型,并返回一个扩展该类型的类当然.此外,原始列表变量可以保存在另一个变量中以保持对其的访问.
我现在面对的问题是,当您通过其文字形式(即[1,4])实例化一个列表时,它仍然会使用原始列表构造函数(或者是吗?).有办法重写这个行为吗?如果答案为否,您是否知道使用户能够扩展内置类型的其他方法? (就像javascript允许扩展内置原型).
我发现这个限制的内置(无法添加成员)是Python的缺点之一,使其与其他用户定义的类型不一致…总体而言,我真的很喜欢这种语言,我真的不明白为什么这样限制是非常必要的.
解决方法
首先,关于修补内置类型,这主要是设计决策,仅次于优化.我从许多潜伏的Python邮件列表中学到了猴子修补内置类型,虽然对于小脚本来说是愉快的,但在任何更大的东西上都不会有好的目的.
一个图书馆对类型做出某些假设.如果鼓励扩展默认类型,许多图书馆就会相互争斗.它也会阻止制作新的类型 – 一个deque是一个deque,一个有序集是一个有序集,一个字典是字典,应该是这样.
文字语法是一个特别重要的一点.如果您不能保证[1,3]是一个列表,您能保证什么?如果人们可以改变这些行为,那么它将会产生这样的全球影响,从而破坏很多代码的稳定性.有一个原因goto和全球变量不鼓励.
有一个特别的黑客,我喜欢,但是.当你看到r“你好”,这似乎是一个扩展的文字形式.
那么为什么不r [1,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,4].each(lambda x: x**2) #>>> [1,4,9,16]
最后,如果你真的想做很深的AST黑客,看看MacroPy.