我正在检查属性的实例是否属于某种类型,但在该评估中,它将作为属性对象返回,而不是我已分配给它的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):
...
答案 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。