gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:00:19 25 4
gpt4 key购买 nike

找不到更好的标题措辞方式,欢迎随时更正。

我是 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))

输出:

1
2
3
4

这个想法当然可以通过定义一个方法来概括,该方法获取一个构建它的类型并返回一个扩展该类型的类。此外,原始的 list 变量可以保存在另一个变量中以保持对它的访问。

我现在面临的唯一问题是,当您以字面形式实例化 list 时,(即 [1,2,3,4]) ,它仍将使用原始列表构造函数(或者是吗?)。有没有办法覆盖这种行为?如果答案是否定的,您是否知道允许用户扩展内置类型的其他方法? (就像 javascript 允许扩展内置原型(prototype)一样)。

我发现内置函数的这种限制(无法向它们添加成员)是 Python 的缺点之一,使其与其他用户定义的类型不一致......总的来说,我真的很喜欢这门语言,但我真的不喜欢理解为什么这个限制是真正必要的。

最佳答案

这是 Python 的良心选择。

首先,关于修补内置类型,这主要是一个设计决定,其次才是优化。我从 Python 邮件列表中潜伏的大量信息中了解到,对内置类型进行猴子修补虽然对于小脚本来说很有趣,但在任何更大的脚本中都没有用处。

图书馆,一方面,对类型做出某些假设。如果鼓励扩展默认类型,许多库最终会互相争斗。它还会阻止制作新类型——双端队列是双端队列,有序集是有序集,字典是字典,应该就是这样。

字面语法是特别重要的一点。如果你不能保证 [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]

最后,如果你真的想进行深度 AST 破解,请查看 MacroPy .

关于python - Python中的文字可以被覆盖吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50927242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com