有没有办法重写__format__方法

时间:2019-01-25 00:31:07

标签: python string

我们知道:

str.format('{:+>10}', 'sometext')

将返回:

'++sometext'

或: '{:+>10}'.format('sometext')将返回'++sometext' 我的问题是,是否有替代方法来覆盖类实例的 format 方法。...我已经尝试过:

class A:
    def __format__(self, spec):
        return spec.format(self)

然后实例化它:

a = A()
a.__format__('{:+>20}')

返回'+>20'这怎么可能... 在此之前感谢

2 个答案:

答案 0 :(得分:3)

def __format__(self,spec):中,spec是格式字符串本身。如果要使用该规范格式化类,则需要以某种方式将其指定为类实例内容的格式,例如:

class Value:

    def __init__(self,value):
        self.value = value

    def __format__(self,fmt):                # fmt='03' from below.
        return f'Value({self.value:{fmt}})'  # f'Value({self.value:03})' is evaluated.

v = Value(5)
print(f'{v:03}')         # Python 3.6+
print('{:04}'.format(v)) # Python <3.6

输出:

Value(005)
Value(0005)

答案 1 :(得分:1)

您可以创建一个像这样的类,该类以初始int值作为长度。我在Python 3中进行了测试,并且可以正常工作。

class Padded:
    def __init__(self, length: int=10, pad='+'):
        self.value = '{{:{}>{}}}'.format(pad, length)
    def format(self, value):
        return self.value.__format__(value)

a=Padded(20)
print(a.__format__('Sometext')) 
#++++++++++++Sometext