【问题标题】:Python: Is it possible to add new methods to the Tuple classPython:是否可以向 Tuple 类添加新方法
【发布时间】:2013-09-21 18:10:14
【问题描述】:

在 Python 中,是否可以向内置类(例如 Tuple)添加新方法。我想添加 2 个新方法: first() 返回元组的第一个元素, second() 返回一个没有第一个元素的新元组。

例如:

x = (1, 2, 3)

x.first()   # 1
x.second()  # (2, 3)

谢谢

【问题讨论】:

  • 不,您必须创建自己的课程。 (你可以继承元组。)
  • 为什么不直接切片元组呢?第一个是t[0],“第二个”是t[1:]。
  • 所以 python 类是封闭的,不能像 Ruby 或 C# 那样扩展。那是对的吗?我是python的新手,所以只想知道什么可以做,什么不能做。能够在不改变其默认行为的情况下扩展现有类可能非常有用。一个例子是 LINQ 主要是通过扩展方法实现的。
  • @user1797036 不可以。用 C 实现的类(大多数内置类都是如此)不能进行猴子补丁。但是,它们可以通过继承来扩展。

标签: python tuples


【解决方案1】:

可以,但不要。

存在一个dark and dangerous forbiddenfruit 不安全且危险地允许这样的事情。但这是一个黑暗的地方。

相反,您可以创建一个新类:

class MyTuple(tuple):
    def first(self):
        return self[0]

    def second(self):
        return self[1:]

mt = MyTuple((1, 2, 3, 4))

mt.first()
#>>> 1
mt.second()
#>>> (2, 3, 4)

最好您可以创建一个不需要每次调用时都复制的实际链表。

最好不要这样做,因为在 Python 中几乎没有任何情况需要自行实现或单链表。

【讨论】:

  • 这与我的回答和 BrenBarn 的评论相同,只是稍后,并且解释较少。
  • Python 有一个标准的链接数据结构:deque
  • 不过,您并没有涵盖实际修改内置类,我认为这是一个相关的(如果没有用的话)添加。
  • 你也没有。禁果实际上并没有改变课程;它创建一个包装器,并更改全局名称的绑定。
  • “forbiddenfruit 实际上并没有改变类”。我很怀疑这种说法。
【解决方案2】:

没有。您可以使用namedtuple 来介绍各种职位的名称;或者你可以继承元组;或者你可以简单地编写函数。函数没有错。

但是,这些都不是一个好主意。最好的办法就是像其他人一样编写代码:使用下标和切片。这些是完全清楚的,并且是每个人都知道的。

最后,你的名字具有很大的误导性: first 返回第一个元素; second 返回一个由第二个和第三个元素组成的元组。

【讨论】:

  • @IgnacioVazquez-Abrams 我会感觉好多了。
  • 或者更直接地说,second 返回除第一个元素之外的所有内容。
  • @BurhanKhalid 是吗?我们知道吗?
  • "and second() 返回一个没有第一个元素的新元组。"
  • @BurhanKhalid 显然我们做到了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 2012-01-19
  • 2018-05-21
相关资源
最近更新 更多