如何在Python中添加字符串的功能

时间:2010-06-23 10:24:54

标签: python

这更像是一个好奇心问题。我是Python的新手并且玩弄它。我刚看了一下base64模块。如果不是这样做会怎么样:

import base64
string = 'Foo Bar'
encoded = base664.b64encode

我想做类似的事情:

>>> class b64string():
>>>   <something>
>>>
>>> string = b64string('Foo Bar')
>>> string
'Foo Bar'
>>> string.encode64()
'Rm9vIEJhcg=='
>>> string
'Rm9vIEJhcg=='
>>> string.assign('QmFyIEZvbw==')
>>> string
'QmFyIEZvbw=='
>>> string.b64decode()
'Bar Foo'
>>> string
'Bar Foo'

是否有一种简单的pythonic方式来创建该类?

我已经开始了:

>>> class b64string(base64):
...   def __init__(self, v):
...     self.value=v

我已经得到了:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Error when calling the metaclass bases
    module.__init__() takes at most 2 arguments (3 given)

不要让我开始(只是为了看看会发生什么):

>>> class b64string(str, base64): pass
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Error when calling the metaclass bases
    metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

我知道如何通过在新类中列出base64的所有属性并使用存储的值作为参数调用它们来手动完成。但这样做有一种干净,pythonic的方式吗?这样做是不是一个坏主意?如果需要的话,这个想法可以用许多这样的模块来完成它,并且有“超级字符串”,它将把我需要做的所有事情作为模块。那不好吗?它是不是pythonic?如果它是pythonic,它是如何完成的?

1 个答案:

答案 0 :(得分:1)

我不认为创建这样复杂的类似字符串的类是一个好主意,但如果你真的想,这里有一个简单的代码片段来运行你的例子。

首先,我们定义一个通用字符串包装器的类。它的核心是__getattr__函数,它将每个方法调用转发给给定的self.module,添加self.string作为第一个参数,并在self.string上记住结果。

import base64

class ModuledString(object):
    def __init__(self, string):
        self.string = string

    def __getattr__(self, attrname):
        def func(*args, **kwargs):
            result = getattr(self.module, attrname)(self.string, *args, **kwargs)
            self.string = result
            return result
        return func

    def __str__(self):
        return str(self.string)

使用base64功能创建字符串包装器非常简单:

class B64String(ModuledString):
    module = base64

if __name__ == '__main__':
    string = B64String('Foo Bar')
    print string
    # 'Foo Bar'
    print string.b64encode()
    # 'Rm9vIEJhcg=='
    print string
    # 'Rm9vIEJhcg=='
    string.string = 'QmFyIEZvbw=='
    print string
    # 'QmFyIEZvbw=='
    print string.b64decode()
    # 'Bar Foo'

请注意,上面的示例只是因为b64encodeb64decode将字符串作为第一个参数并返回一个字符串作为结果(我的__getattr__函数中没有验证) 。来自某个随机模块的随机函数可能会引发某种异常。毕竟,最好将使用限制在给定模块的预定义函数集中,但现在应该很容易。

我再说一遍,我不建议在任何严肃的项目中使用此类代码,只是为了好玩。