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

2024-04-27 00:56:49 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个比任何其他问题都更令人好奇的问题。我是Python的新用户,并在玩它。我刚刚看了base64模块。如果不做:

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

我想做些类似的事情:

^{pr2}$

有没有一种简单的python方法来创建这个类?在

我从这个开始:

>>> 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的所有属性并用存储值作为参数来调用它们,从而手动完成这项工作。但是有没有一种干净的,Python式的方法来做到这一点呢?这样做是个坏主意吗?这个想法是,如果需要的话,用很多这样的模块来做,并且使用“超级字符串”作为模块来处理我需要做的所有事情。这很糟糕吗?它不是Python吗?如果是Python,怎么做?在


Tags: 模块ofthe方法selfmostinit事情
1条回答
网友
1楼 · 发布于 2024-04-27 00:56:49

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

首先,我们定义一个类,它是一个泛型字符串包装器。它的核心是一个__getattr__函数,它将每个方法调用转发给给定的self.module,添加{}作为第一个参数,并记住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功能的字符串包装器很容易:

^{pr2}$

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

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

相关问题 更多 >