如何确定属性是位于原始类还是继承类?

Equ*_*Dev 1 python attributes python-3.x

在下面的代码中:

class Klass_1:
    a = 1

class Klass_2(Klass_1):
    b = 2

k = Klass_2()
Run Code Online (Sandbox Code Playgroud)

它可以同时访问k.ak.b,和hasattr(k, ...)True两个"A"和"B".

如何确定属性是位于原始类Klass_2还是继承类Klass_1

Mar*_*ers 6

您必须检查__dict__MRO中每个类的对象(您可以使用vars()此处的函数来使代码更清晰):

def class_for_attribute(instance, attribute_name):
    for cls in type(instance).mro():
        if attribute_name in vars(cls):
            return cls
Run Code Online (Sandbox Code Playgroud)

演示:

>>> class_for_attribute(k, 'a')
<class '__main__.Klass_1'>
>>> class_for_attribute(k, 'b')
<class '__main__.Klass_2'>
Run Code Online (Sandbox Code Playgroud)