我希望班级检查是否:
我的解决方案(不工作):
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
装饰器。 我只想要 - 将方法称为属性
答案 0 :(得分:0)
这是Python的工作方式。方法只是类型绑定方法的属性。
你可以让这项工作更好,但只能启发式。例如。如果你想禁止绑定方法,请检查类型,然后调用。
然而,如果返回该绑定方法,这将意味着您遇到麻烦,因为它应该是属性提供的回调。
如果存在给定名称的属性声明等,您还可以检查对象的类 - 属性。
总而言之,我会质疑你的做法。有一个简单的解决方案:让用户做出决定,而不是假设是什么。
答案 1 :(得分:0)
__getattr__
。查找项目时,首先运行对象的__getattribute__
。如果它引发AttributeError
(它没有在对象的dict中找到它) - 那么它会调用__getattr__
。
您的代码返回bound method
的原因是从未执行__getattribute__代码,因为该属性是通过常规查找过程找到的。即使它被执行了,它也行不通。 item
是一个包含参数的变量。 self.item
不存在;这样做的方法是使用attr = getattr(self, item)
。
您需要的是@property
,它允许您访问类似属性的方法:
... class code ...
@property
def x(self):
return 1
a = A()
print a.x
1
请注意,您不能再将该属性作为函数调用:
a.x()
Traceback (most recent call last):
File "C:\Python27\tests\test.py", line 12, in <module>
print a.x()
TypeError: 'int' object is not callable