标识定义类级变量的超类

时间:2018-04-21 02:24:13

标签: python

在python中有多重继承的情况下,有没有办法识别从哪个超类中获取类级变量?

我试图谷歌的所有尝试绝大多数关于如何让属性找不到它的来源:

https://www.google.com/search?q=pythin+which+super+class+defines+attr

https://www.google.com/search?q=python+which+super+class+has+attribute&oq=python+which+super+class+has+attr

https://www.google.com/search?q=python+which+super+class+attribute+obtained+from

我想我可以使用inspect.getmro(cls)手动逐步完成MRO。但我无法找到更优雅的解决方案。只是想知道是否有人知道。

修改

具体例子:

class Super1(object):
    __class_attribute__ = "Foo"

class Super2(object):
    pass

class Derived(Super1, Super2):
    pass

d = Derived()

parent_cls = some_function_to_get_defining_class(d.__class_attribute__) # <-- should return `Super1`

1 个答案:

答案 0 :(得分:0)

__qualname__属性指示继承方法的类。但是,这只返回一个字符串,而不是超类本身。如果你需要超类来进行元编程,我想你将不得不深入研究MRO。

class A:
    def a(self):
        return 1
    def b(self):
        return 2

class B:
    def b(self):
        return 2.5
    def c(self):
        return 3

class C(A,B):
    pass

使用:

C.b.__qualname__
# returns:
'A.b'

但是,当使用抽象方法定义接口时,这不适用,因为必须覆盖该方法。

from abc import abstractmethod

class A:
    def a(self):
        return 1

    @abstractmethod
    def b(self):
        pass

class C(A):
    def b(self):
        return 100

C.b.__qualname__
# returns:
'C.b'