对象属性具有<type'property'=“”> </type>

时间:2014-12-29 23:00:26

标签: python python-2.7 properties

我有一个定义了字符串属性的类。

class Foo(object):
    @property
    def kind(self):
        return 'bar'

我希望将此属性传递给该属性的某些第三方代码断言该属性为str

第三方:

def baz(kind):
    if not isinstance(kind, (str, unicode)):
        message = ('%.1024r has type %s, but expected one of: %s' %
                   (kind, type(kind), (str, unicode)))
        raise TypeError(message)

我:

foo = Foo()
baz(foo.kind)

输出:

TypeError: <property object at 0x11013e940> has type <type 'property'>, but expected one of: (<type 'str'>, <type 'unicode'>)

有什么方法可以让python对象拥有str类型而不是property类型的属性?

编辑:

原始问题是错误的,我实际上是在打电话

Foo.kind

正如下面Martijn Pieters所指出的那样。

2 个答案:

答案 0 :(得分:4)

您正在上直接访问该属性

>>> Foo.kind
<property object at 0x104a22c00>
>>> baz(Foo.kind)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in baz
TypeError: <property object at 0x104a22c00> has type <type 'property'>, but expected one of: (<type 'str'>, <type 'unicode'>)

如果你确实有一个实例,你发布的功能就可以了:

>>> Foo().kind
'bar'
>>> baz(Foo().kind)

这是因为只有当属性绑定到实例时才会在访问时使用getter函数。绑定到类时,将直接返回property对象。

另见How does the @property decorator work?

答案 1 :(得分:0)

您的代码适用于我:

class Foo(object):
    @property
    def kind(self):
        return 'bar'

def baz(kind):
    if not isinstance(kind, (str, unicode)):
        message = ('%.1024r has type %s, but expected one of: %s' %
                   (kind, type(kind), (str, unicode)))
        raise TypeError(message)


foo = Foo()
print foo.kind

baz(foo.kind)


--output:--
bar