我想让我的班级检查一下:
我的解决方案(不起作用):
class A:
def __getattr__(self, item):
try:
return self.item()
except AttributeError:
try:
return self.item
except AttributeError:
raise AttributeError
y = 2
def x(self):
return 1
我的测试:
a = A()
print(a.x)
我的结果:
<bound method A.x of <__main__.A object at 0x7f992de18c50>>
如您所见,它返回对函数的引用,而不是其结果。我哪里出错了
我的问题通过使用
@property
装饰工。 我只想把方法作为属性调用
这就是Python的工作方式。方法只是类型绑定方法的属性
你可以做得更好,但只是试探性的。例如,如果要禁止绑定方法,请检查类型,然后调用
然而,这意味着您将陷入麻烦,如果绑定方法被返回,因为它应该是一个属性提供的回调
如果给定名称等有属性声明,还可以检查对象的class-属性
总之,我怀疑你的方法。有一个简单的解决方案:让用户来做决定,而不是假设事情是什么
__getattr__
仅在常规查找未找到该项时调用。查找项目时,首先运行对象的__getattribute__
。如果它引发AttributeError
(它在对象的dict中没有找到它),那么它调用__getattr__
代码返回
bound method
的原因是从未执行过uuu getattribute\uuuuu代码,因为该属性是通过常规查找过程找到的。即使它被处决了,也行不通item
是保存参数的变量self.item
不存在;方法是使用attr = getattr(self, item)
您需要的是
@property
,它允许您像访问属性一样访问方法:注意:不能再将属性作为函数调用:
相关问题 更多 >
编程相关推荐