【问题标题】:Is it possible to add a method to a native class?是否可以向本机类添加方法?
【发布时间】:2019-05-09 02:43:59
【问题描述】:

令我惊讶的是,与 BASIC 不同,python 没有字符串的 .left、.right 和 .mid 方法。

正如在别处所说,编写函数来实现这一点很容易,但是可以将方法添加到本机类吗?

这样

a = "Spam" 
b = a.left(3)   
print(b)

会输出:

Spa

【问题讨论】:

  • Python 有切片器,你可以使用b = a[0:3] 来实现你想要的输出。见stackoverflow.com/questions/509211/understanding-slice-notation
  • 你可以使用诸如禁止水果之类的东西......但这根本不是一个好主意而且相当脆弱......你应该只使用切片a[:3]是.lefta[-3:].right 你需要弄清楚中间的索引,但这不应该太难......基本并不是编程语言的黄金标准
  • 是的,切片可以,但我想知道是否可以向原生类添加方法。但是现在我很好奇:什么是禁果?

标签: python string methods basic


【解决方案1】:
b = a[:3]

将占用字符串的 3 个第一个字符

b = a[:15]

不会出错(在python2上不确定)

c = a[-3:]

最后 3 个字符

但你仍然可以覆盖(继承)字符串类型

class MySuperString(str):
    def left(self, num_char):
        return self[:num_char]

a = MySuperString('plop')
b = a.left(3)

例如:http://www.nomadiccodemonkey.com/?p=590

编辑:

if isinstance(a, str):

不再起作用了,改用这个吧:

if issubclass(a, str):

或者自然是这个:

if isinstance(a, MySuperString):

法国笑话:et ça marche meme si tu mets des SuperSlip!

【讨论】:

  • 啊,是的!创建一个从 str 类继承的新类是一个优雅的解决方案。谢谢
【解决方案2】:

您可以创建自己的函数。

right = lambda str, index: str[-index:]
left = lambda str, index: str[:index]
a = "Spam"
print(left(a,3))
print(right(a,3))

【讨论】:

  • 是的,但这些是函数,我正在询问是否向 str 类添加方法。
  • @Thot 您无法将函数添加到现有的内置数据类型,因为它们是用 C 编写的。您可以创建自己的 string class 扩展 str。但是,您必须将字符串创建为 .. name = string("aaa")
猜你喜欢
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 2016-09-19
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
  • 2012-08-05
  • 2019-06-07
相关资源
最近更新 更多