我有一个类:
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