我的印象是使用 .format() 的 python 字符串格式化会正确使用属性,而不是我得到字符串格式化的对象的默认行为:
>>> def get(): return "Blah"
>>> a = property(get)
>>> "{a}!".format(a=a)
'<property object at 0x221df18>!'
这是预期的行为吗?如果是这样,什么是实现属性特殊行为的好方法(例如,上面的测试将返回“Blah!”)?
我的印象是使用 .format() 的 python 字符串格式化会正确使用属性,而不是我得到字符串格式化的对象的默认行为:
>>> def get(): return "Blah"
>>> a = property(get)
>>> "{a}!".format(a=a)
'<property object at 0x221df18>!'
这是预期的行为吗?如果是这样,什么是实现属性特殊行为的好方法(例如,上面的测试将返回“Blah!”)?
property
对象是描述符。因此,除非通过类访问,否则它们没有任何特殊能力。
就像是:
class Foo(object):
@property
def blah(self):
return "Cheddar Cheese!"
a = Foo()
print('{a.blah}'.format(a=a))
应该管用。(你会看到Cheddar Cheese!
打印出来的)
是的,这与您刚刚执行的操作基本相同:
>>> def get(): return "Blah"
>>> a = property(get)
>>> print a
如果您"Blah"
只想调用该函数:
>>> def get(): return "Blah"
>>> a = property(get)
>>> "{a}!".format(a=a.fget())
Python 属性可以与 .format() 很好地互操作。考虑以下示例:
>>> class Example(object):
... def __init__(self):
... self._x = 'Blah'
... def getx(self): return self._x
... def setx(self, value): self._x = value
... def delx(self): del self._x
... x = property(getx,setx,delx, "I'm the 'x' property.")
...
>>>
>>> ex = Example()
>>> ex.x
'Blah'
>>> print(ex.x)
'Blah'
>>> "{x.x}!".format(x=ex)
'Blah!'
我相信您的问题源于您的财产不是班级的一部分。您实际上是如何使用它们不使用 .format() 的属性的?