这更像是一个好奇心问题。我是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,它是如何完成的?
答案 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'
请注意,上面的示例只是因为b64encode
和b64decode
将字符串作为第一个参数并返回一个字符串作为结果(我的__getattr__
函数中没有验证) 。来自某个随机模块的随机函数可能会引发某种异常。毕竟,最好将使用限制在给定模块的预定义函数集中,但现在应该很容易。
我再说一遍,我不建议在任何严肃的项目中使用此类代码,只是为了好玩。