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

问题描述 投票:12回答:1

找不到更好的标题标题的方法,随时纠正。

我是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允许扩展内置原型一样)。

我发现内置的这种限制(无法向其中添加成员)是Python的缺点之一,使其与其他用户定义的类型不一致...总的来说,我真的很喜欢这种语言,而且我真的不明白为什么确实需要此限制。

python literals
1个回答
19
投票

这是Python的一个认真的选择。

首先,关于修补内置类型,这主要是设计decision,其次才是优化。我从潜伏在Python邮件列表中的很多教训中学到,对内置类型进行猴子修补,尽管对于小型脚本来说很有趣,但在更大的领域中并没有什么用处。

图书馆之一,对类型进行某些假设。如果鼓励扩展默认类型,那么许多库最终将彼此争斗。它也会阻止making新类型-双端队列是双端队列,有序集合是有序集合,字典是字典,应该是这样。

文学语法是特别重要的一点。如果您不能保证[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
© www.soinside.com 2019 - 2024. All rights reserved.