Если у вас не задействованы super
-вызовы (или, в более общем случае, подклассы, которые переопределяют x
и обращаются напрямую к A.x(self)
как часть реализации их переопределения), ища первый элемент в type(self).mro()
, который имеет x
атрибут будет работать -
next(c for c in type(self).mro() if hasattr(c, 'x'))
Если вам нужно покрыть вызовы super
, это будет сложнее - если только вы не узнаете, что никакой супер -класс A
не определяет атрибут x
(и, конечно, легче узнать о ваших суперклассах, чем о ваших подклассах, хотя множественное наследование усложняет его ;-) в этом случае вам нужен только последний соответствующий элемент mro
вместо первого.