如何访问所有 parent 类 的属性?
How can I access attributes from all parent classes?
class T(object):
def f(self):
pass
class T1(T):
fields = set(('x1', 'y1', 'z1'))
class T2(T1):
fields = set(('x2', 'y2'))
t=T2()
我想要调用 t.f()
return set(('x1','y1','z1','x2','y2'))
,我不想在每个 child class 中重写 'f' ,有什么想法吗?
这适用于您的示例:
class T(object):
def f(self):
fields = set()
for cls in self.__class__.mro():
if hasattr(cls, 'fields'):
fields = fields.union(cls.fields)
return fields
class T1(T):
fields = set(('x1', 'y1', 'z1'))
class T2(T1):
fields = set(('x2', 'y2'))
t = T2()
t.f()
returns:
{'x1', 'x2', 'y1', 'y2', 'z1'}
方法mro()
为您提供方法解析顺序。这是一个列表classes Python依次访问查找的方法。因此,如果一个方法没有在子 class 中退出,它将在该列表的 classes 中查找。如果最后一个 class 没有这个属性,它将抛出一个 AttributeError
。这里我们使用这个列表在parents列表中搜索属性fields
,并将所有找到的集合放在结果集合fields
中。
class T(object):
def f(self):
pass
class T1(T):
fields = set(('x1', 'y1', 'z1'))
class T2(T1):
fields = set(('x2', 'y2'))
t=T2()
我想要调用 t.f()
return set(('x1','y1','z1','x2','y2'))
,我不想在每个 child class 中重写 'f' ,有什么想法吗?
这适用于您的示例:
class T(object):
def f(self):
fields = set()
for cls in self.__class__.mro():
if hasattr(cls, 'fields'):
fields = fields.union(cls.fields)
return fields
class T1(T):
fields = set(('x1', 'y1', 'z1'))
class T2(T1):
fields = set(('x2', 'y2'))
t = T2()
t.f()
returns:
{'x1', 'x2', 'y1', 'y2', 'z1'}
方法mro()
为您提供方法解析顺序。这是一个列表classes Python依次访问查找的方法。因此,如果一个方法没有在子 class 中退出,它将在该列表的 classes 中查找。如果最后一个 class 没有这个属性,它将抛出一个 AttributeError
。这里我们使用这个列表在parents列表中搜索属性fields
,并将所有找到的集合放在结果集合fields
中。