Python 如何返回继承链中所有类的属性?

Python 如何返回继承链中所有类的属性?,python,Python,如果您有一个类层次结构,并且某个类属性在子类中被重写,那么子类的用户不应该关心父类中该属性的值是多少 但这正是我想要实现的: class A: _ITEM = "A" @classmethod def getClassPath(cls): ??? class B(A): _ITEM = "B" class C(B): _ITEM = "C" # expected be

如果您有一个类层次结构,并且某个类属性在子类中被重写,那么子类的用户不应该关心父类中该属性的值是多少

但这正是我想要实现的:

class A:
    _ITEM = "A"

    @classmethod
    def getClassPath(cls):
        ???


class B(A):
    _ITEM = "B"


class C(B):
    _ITEM = "C"


# expected behavior:
A.getClassPath()  # "/A"
B.getClassPath()  # "/A/B"
C.getClassPath()  # "/A/B/C"
我最初的问题稍微复杂一些,但它简化为:从层次结构中的所有类中获取
\u ITEM
属性,并以某种方式组合它们


我怎么做?在我的例子中没有多重继承。

您可以使用
mro
(方法解析顺序)访问继承链中的属性。简单的情况是:

class A:
    _ITEM = "A"
    
    @classmethod
    def get_class_path(cls):
        result = cls.mro()[:-1]
        result = [res._ITEM for res in reversed(result)]
        result = "/" + "/".join(result)
        return result
此外,如果您想跳过没有
\u项的类,可以使用
vars()
稍微修改:

输出:

B.get_class_path() # returns '/attr_A'
C.get_class_path() # returns '/attr_A/attr_C'

我相信您想要实现的目标可以通过使用方法解析顺序(mro)来实现。通过操纵它提供给您的列表,您可以构建您想要的路径。只需使用父方法并附加到它就更容易了。通过使用
getClassPath
方法,您实际上想要实现什么?@venky\uuuu?并不是那么简单。如何组合元素的规则没有改变,因此我希望我的方法只在一个类(层次结构的基类)中实现。在这种情况下没有“父方法”!谢谢,我明白了。
get\u class\u path
方法的实现不接受
\u ITEM
属性的值,而是使用类的名称。在我的问题中,
\u ITEM
属性的值与类名相同-但这只是一个共通点!我懂了。你真的想返回类似于
f“{A.\u ITEM}/{B.\u ITEM}”
的东西吗?是的!还有一件事:该值可能不会在某些类中声明。F.e.如果在
类别B
中未重写该值,则
C的预期结果。get\u class\u path()
应为“/A/C”,而不是“/A/C”。我想我可以使用
is
检查来检测“加倍”项目。有更好的方法吗?@lesnik更新,我认为这应该适合你
B.get_class_path() # returns '/attr_A'
C.get_class_path() # returns '/attr_A/attr_C'