Python中的文字可以被覆盖吗?

前端之家收集整理的这篇文章主要介绍了Python中的文字可以被覆盖吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
找不到一个更好的短语标题方法,随时纠正.

我对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的认真选择.

首先,关于修补内置类型,这主要是设计决策,仅次于优化.我从许多潜伏的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.

原文链接:https://www.f2er.com/python/186115.html

猜你在找的Python相关文章