检查类属性:方法、属性或不存在

2024-10-03 11:15:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我想让我的班级检查一下:

  1. 所需属性存在
  2. 如果它是一个方法,它应该返回一个method的结果
  3. 如果是属性,则返回值
  4. 如果不存在,则引发AttributeException

我的解决方案(不起作用):

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 

装饰工。 我只想把方法作为属性调用


Tags: 方法selfreturn属性def解决方案itemmethod
2条回答

这就是Python的工作方式。方法只是类型绑定方法的属性

你可以做得更好,但只是试探性的。例如,如果要禁止绑定方法,请检查类型,然后调用

然而,这意味着您将陷入麻烦,如果绑定方法被返回,因为它应该是一个属性提供的回调

如果给定名称等有属性声明,还可以检查对象的class-属性

总之,我怀疑你的方法。有一个简单的解决方案:让用户来做决定,而不是假设事情是什么

__getattr__仅在常规查找未找到该项时调用。查找项目时,首先运行对象的__getattribute__。如果它引发AttributeError(它在对象的dict中没有找到它),那么它调用__getattr__

代码返回bound method的原因是从未执行过uuu getattribute\uuuuu代码,因为该属性是通过常规查找过程找到的。即使它被处决了,也行不通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

相关问题 更多 >