【问题标题】:Python Use User Defined String ClassPython 使用用户定义的字符串类
【发布时间】:2018-06-22 05:47:35
【问题描述】:

我知道如何覆盖字符串类:

class UserString:
    def __str__(self):
        return 'Overridden String'

if __name__ == '__main__':
    print UserString()

但是我如何使用这个类而不是内置的str 类而不隐式定义UserString 类?要清楚 我想要这个:

>>> print "Boo boo!"
Overridden String

【问题讨论】:

  • 不可能。您没有“覆盖字符串类”,您已经定义了一个可以将其实例转换为字符串的类。您不能更改字符串文字的类型。
  • 你想使用这个类吗?或者您只是对覆盖 print 感兴趣?
  • 我正在尝试找到一种新方法 - 可以无缝集成到大写特殊土耳其 unicode 字符。也就是说,当一个MYSTRING.upper()方法触发时,我想触发我自己的upper()方法。

标签: python


【解决方案1】:

这是不可能的。您尚未覆盖字符串类。

您不能覆盖类。您可以覆盖方法。您所做的是定义了一个类,并且只覆盖了它的 str() 方法。

但是你可以做这样的事情......

def overriden_print(x):
    print "Overriden in the past!"

from __future__ import print_function  # import after the definition of overriden_print

print = overriden_print

print("Hello")

输出:

在过去被覆盖!

【讨论】:

    【解决方案2】:

    如果不破解 python 可执行文件本身,就不可能做你想做的事......毕竟,str 是一个内置类型,而解释器在传递'string' 类型立即数时,将始终创建内置字符串。

    但是... 有可能,使用委托来做这样的事情。这是从另一个 stackoverflow 配方略微修改的(遗憾的是,我的代码中没有包含指向的链接......),所以如果这是你的代码,请随时声明它:)

    def returnthisclassfrom(specials):
      specialnames = ['__%s__' % s for s in specials.split()]
      def wrapit(cls, method):
        return lambda *a: cls(method(*a))
      def dowrap(cls):
        for n in specialnames:
          method = getattr(cls, n)
          setattr(cls, n, wrapit(cls, method))
        return cls
      return dowrap
    

    然后你这样使用它:

    @returnthisclassfrom('add mul mod')
    class UserString(str):
        pass
    
    In [11]: first = UserString('first')
    
    In [12]: print first
    first
    
    In [13]: type(first)
    Out[13]: __main__.UserString
    
    In [14]: second = first + 'second'
    
    In [15]: print second
    firstsecond
    
    In [16]: type(second)
    Out[16]: __main__.UserString
    

    这样做的一个缺点是str 不支持radd,因此'string1' + UserString('string2') 将给出一个字符串,而UserString('string1') + 'string2' 给出一个UserString。不知道有没有办法解决。

    也许没有帮助,但希望它能让你走上正轨。

    【讨论】:

    • 谢谢,这不是我想要的,但我喜欢它,因为它使用了装饰器。你的代码看起来像stackoverflow.com/a/1243045/1766716 :)
    • 就是这个...感谢您找到它! (现在在代码中注释......)
    猜你喜欢
    • 2013-11-27
    • 2018-10-31
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多