5

我的印象是使用 .format() 的 python 字符串格式化会正确使用属性,而不是我得到字符串格式化的对象的默认行为:

>>> def get(): return "Blah"
>>> a = property(get)
>>> "{a}!".format(a=a)
'<property object at 0x221df18>!'

这是预期的行为吗?如果是这样,什么是实现属性特殊行为的好方法(例如,上面的测试将返回“Blah!”)?

4

3 回答 3

9

property对象是描述符。因此,除非通过类访问,否则它们没有任何特殊能力。

就像是:

class Foo(object):
     @property
     def blah(self):
         return "Cheddar Cheese!"

a = Foo()
print('{a.blah}'.format(a=a))

应该管用。(你会看到Cheddar Cheese!打印出来的)

于 2013-03-11T20:35:36.673 回答
1

是的,这与您刚刚执行的操作基本相同:

>>> def get(): return "Blah"
>>> a = property(get)
>>> print a

如果您"Blah"只想调用该函数:

>>> def get(): return "Blah"
>>> a = property(get)
>>> "{a}!".format(a=a.fget())
于 2013-03-11T20:35:16.830 回答
1

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() 的属性的?

于 2013-03-11T21:00:26.800 回答