如何使类可调用的成员可迭代?



我有一个类:

class Cls(object):
foo = MyItem()
bar = 'hello'
def __init__(self, test):
self.test = test
def func(self):
return 'call me'

我想循环通过类成员只有当他们是可调用的项目,如foo。实际上MyItem()类在内部实现了一个__call__函数,但是它也有像name.

这样的属性。这是MyItem类

class MyItem(object):
widget = LabelValue()
name = ""
data = ""
def __init__(self, name="", label="", info={}, widget=None):
if widget is not None:
self.widget = widget
self.name = name
self.label = label
self.info = info
def __call__(self, **kwargs):
self.widget(item =self, **kwargs)

我将这个函数添加到我的类中:

def __iter__(self):
for attr in dir(self):
if not attr.startswith("__") and callable(getattr(self, attr)):
yield getattr(self, attr)

我测试它如下:

r = {}
for i in Cls():
r[i] = i

它遍历MyItem对象,但是如果我想访问像

这样的名称
for i in Cls():
r[i] = i.name

它抛出:

AttributeError: 'function' object has no attribute 'name'

另外,如果我能以某种方式将所有这些成员作为列表并添加到类中,如_myitems将是好的,但我不知道如何做到这一点。

可以这样实现:

class Cls(object):
foo = MyItem()
bar = 'hello'
def __init__(self, test):
self.test = test
self._items = [getattr(self, attr) 
for attr in dir(self) 
if not attr.startswith("__") 
and isinstance(getattr(self, attr), MyItem)]
def __iter__(self):
for item in self._items:
yield item

最新更新