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

如何在Python中向字符串添加功能,python,Python,这更像是一个好奇的问题。我是Python新手,正在玩弄它。我刚刚看过base64模块。如果不执行以下操作,该怎么办 import base64 string = 'Foo Bar' encoded = base664.b64encode 我想做一些事情,比如: >>> class b64string(): >>> <something> >>> >>> string = b64string('Foo Bar

这更像是一个好奇的问题。我是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'
我已经得到:

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)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:调用元类基时出错
module.\uuuu init\uuuu()最多接受2个参数(给定3个)
不要让我开始(只是为了看看会发生什么):

类b64string(str,base64):通过 ... 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:调用元类基时出错 元类冲突:派生类的元类必须是其所有基元类的(非严格)子类
我知道如何通过在一个新类中列出base64的所有属性并使用存储值作为参数调用它们来手动完成。但是,有没有一种简洁、通灵的方法可以做到这一点呢?这样做是个坏主意吗?如果需要的话,我们的想法是使用许多这样的模块,并使用“超级字符串”作为模块,包含我需要使用它们所做的所有事情。那么糟糕吗?这不是肾盂吗?如果它是pythonic的,那么它是如何实现的?

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

首先,我们定义一个类,它是一个通用的字符串包装器。它的核心是一个
\uu getattr\uuu
函数,它将每个方法调用转发给给定的
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'
请注意,上述示例之所以有效,是因为
b64encode
b64decode
将字符串作为第一个参数,并返回字符串作为结果(my
\uuuu getattr\uuuu
函数中没有验证)。来自某个随机模块的随机函数可能会引发某种异常。因此,毕竟,最好将使用限制为来自给定模块的预定义函数集,但现在应该很容易了


我重复一遍,我不建议在任何严肃的项目中使用这样的代码,只是为了好玩。

编码(“base64”)有任何问题吗?我还没有足够的Python知识来回答您的主要问题,但您的错误消息至少是试图将
base64
子类化,这是一个模块,而不是一个类。谢谢!(很抱歉反应太晚了。)这是非常有用的,当然,对于任何实际的代码来说都不是,但对于理解Python如何工作以及如何最好地使用它来说却是非常有用的。我本以为一个通用的包装器会被过度使用,还有很多其他的事情我会从一个完全不同的角度考虑。这正是我需要的。明亮的
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)
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'