在实例评估中作为属性对象返回的属性,而不是它的getter

时间:2018-04-19 15:33:47

标签: python python-3.x

我正在检查属性的实例是否属于某种类型,但在该评估中,它将作为属性对象返回,而不是我已分配给它的getter。

类似问题的其他答案表明,这可能是因为getter使用了尚未定义的东西,但据我所知,一切都已定义。

定义:

class SceneController():

    ...

    def get_scene(self):
        if self._current_level_name is not None and self._current_level_name in self._scene_stack:
            return self._scene_stack[self._current_level_name]
        else:
            return None


scene_control = SceneController()

@property
def scene():
    return scene_control.get_scene()

使用失败:

# Prints <class 'property'>
print(type(scene))

# This fails
if isinstance(scene, GameScene):
    ...

2 个答案:

答案 0 :(得分:2)

这应该有效:

if isinstance(scene(), GameScene)
    ...

因为您正在将@property修饰函数与从get_scene返回的任何实例的类型进行比较。我假设self._scene_stack[...]属于GameScene

使用@property装饰器时应该小心,因为它是特殊装饰器,因为它提供了额外的属性(只需尝试输入property().getter)。从本质上讲,装饰者喜欢:

@foo
def bar():
    ...

基本上是foo(bar()),所以我不确定这是否是您首先对装饰器的实际用例。

答案 1 :(得分:2)

在python中,property()是一个内置函数,它创建并返回一个属性对象。

此功能的签名是: property(fget=None, fset=None, fdel=None, doc=None)

fget是getter,fset是setter,fdel是属性的删除属性。

当您写下以下属性时:

@property def foo(): return 'something'

它内部映射到foo=property(foo)。返回的值是属性对象。

您可以isinstance(foo, property)查看。它将返回True。

有关详情,请按property in python