Function Python,决定@property和函数之间的关系

Function Python,决定@property和函数之间的关系,function,class,python-2.7,properties,Function,Class,Python 2.7,Properties,有没有办法判断一个对象是函数还是属性?我知道函数是一个属性,但我想使用\uuuu iter\uuuu()返回一个生成器,该生成器只将属性作为键/值对返回 以下是我认为我可以做的: class A(object): _a = None _b = None def __init__(self, a, b): self._a = a self._b = b @property def a(self):

有没有办法判断一个对象是函数还是属性?我知道函数是一个属性,但我想使用
\uuuu iter\uuuu()
返回一个生成器,该生成器只将属性作为键/值对返回

以下是我认为我可以做的:

class A(object):
     _a = None
     _b = None
     def __init__(self, a, b):
          self._a = a
          self._b = b
     @property
     def a(self):
         return self._a
     def b(self):
         return self._b
     def __iter__(self):
          attributes = [attr for attr in dir(self)]
          for att in attributes:
               if hasattr(att, 'property'): # this does not work
                  yield (att, getattr(self, att)

\uu iter\uu()
应该只为属性
a
提供一个键/值,而不为
b
返回任何内容。可以在Python中执行此操作吗?

您有几个选项。请记住,
dir
包含所有内容,但看起来您需要的是不可调用且不以任何下划线开头的内容,即

def __iter__(self):
    attrs = [a for a in dir(self) if not a.startswith("_")]
    for attr_name in attrs:
        attr = getattr(self, attr_name)
        if not hasattr(attr, "__call__"): # or if not callable(attr):
            yield attr_name, attr

属性只是一个描述符,因此需要通过类而不是实例来访问实际属性。因此,请尝试以下方法:

for att in attributes:
    try:
        if isinstance(getattr(type(self), att), property):
            yield 'whatever you want to yield'
    except:
        pass

没有我的公司。与我一起,但请尝试
\uuu dict\uu
绕过描述符机制并获取底层属性对象。