当前位置: 首页 > 面试题库 >

可以重写Python中的文字吗?

任昊苍
2023-03-14
问题内容

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

我是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通过原义形式实例化a时(即[1,2,3,4]),它仍将使用原始的列表构造函数(或者是?)。有没有办法覆盖这种行为?如果答案是否定的,您是否知道使用户能够扩展内置类型的其他方法?(就像javascript允许扩展内置原型一样)。

我发现内置的这种限制(无法向其添加成员)是Python的缺点之一,使其与其他html" target="_blank">用户定义的类型不一致…总的来说,我真的很喜欢这种语言,而且我真的不明白为什么这样做限制是非常必要的。


问题答案:

这是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。



 类似资料:
  • 我想知道: 为什么在Java中不能重写静态方法? 静态方法可以在Java中重载吗?

  • 本文向大家介绍Python程序可以计算给定字符串中的大小写字符。,包括了Python程序可以计算给定字符串中的大小写字符。的使用技巧和注意事项,需要的朋友参考一下 对于给定的字符串输入,我们希望使用python计算小写字母和大写字母的字符数。例如,对于给定的字符串, 计数应该是- 我们可以使用带有2个条件的简单for循环来实现此功能,以检查大小写字符。例如, 示例 输出结果 这将给出输出-

  • 问题内容: 因此,我试图找出最好的方法(以最少的代码量实现最优雅的方法)以允许重写python中某个属性的特定功能(例如,仅使用getter,仅使用setter等)。我喜欢下面的属性处理方式,因为它们的所有方法都封装在同一缩进的代码块中(更容易看到处理一个属性的函数在哪里停止,而处理一个属性的函数在哪里停止比较容易下一个开始): 但是,如果我想从以这种方式定义属性的类中继承,然后重写setter函

  • 问题内容: 我可以在Python中重置迭代器/生成器吗?我正在使用DictReader,并希望将其重置为文件的开头。 问题答案: 我看到很多建议itertools.tee的答案,但这忽略了文档中的一项重要警告: 此itertool可能需要大量辅助存储(取决于需要存储多少临时数据)。一般来说,如果一个迭代器使用大部分或全部的数据的另一个前开始迭代器,它是更快地使用代替。 基本上,是专为那些在两个(或

  • 我的用户必须输入一个字符串,如21/99,其中数字和符号是用户可以输入的唯一有效符号,理想情况下,这些符号都会显示在键盘上和其他小符号上。不幸的是,无论是数字还是文本,我在这样的UI中都找不到任何其他类型。有没有一种方法可以让我的用户轻松地输入这些数字。

  • 问题内容: 假设我有一个自定义类,该类实现/重写了一些方法: 现在,我现在必须通过在构造函数中传递一个字符串来手动创建的实例: 这还不错,但是它导致了这样的想法,即使用类似于or或or的自定义字符串前缀会很酷。 是否有可能在Python中创建/注册这样的自定义字符串文字前缀,以使文字产生新的实例? 还是将这些前缀硬编码到Python解释器中? 问题答案: 这些前缀在解释器中进行了硬编码,您不能注册