加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-16 23:21:15 所属栏目:Python 来源:网络整理
导读:找不到一个更好的短语标题的方法,随时纠正. 我对Python很新,目前正在尝试使用这种语言..我注意到所有内置类型都无法与其他成员进行扩展..我想举个例子来添加每个方法到列表类型,但是这是不可能的.我意识到这是为了效率原因而设计的,大多数内置类型都是在C中
找不到一个更好的短语标题的方法,随时纠正.

我对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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读