我们如何确定一个属性是属于实例还是属于 Class?

How Can We Determine Whether an Attribute belongs to the Instance or to the Class?

简介

在 Python 中,我想获取属于 class 而不是实例的对象的所有属性的列表(所有静态属性的列表)。


一些用于测试潜在解决方案的代码:

class Klass:

    static_var = 'static_var string'

    def __init__(self):
        self.instance_var = 'instance_var string'

    def instance_method(self, *args, **kwargs):
        pass

    @staticmethod
    def static_method(*args, **kwargs):
        # can be passed almost anything and ignores it.
        pass

obj = Klass()

尝试失败次数:

起初我尝试了以下方法:

def class_attrs_which_are_not_instance_attrs(obj):
    return set(set(type(obj).__dict__) - set(obj.__dict__))

但是,obj.__dict__ 是空的,所以函数只返回 type(obj).__dict__

我注意到的一些事情:

dir(type(obj)) == dir(obj)

type(obj).__dict__dir(type(obj))

代码

这是我的解决方案:

def static_attributes(obj):
    """
    Generator to return a list of names and attributes which are
    class-level variables or static methods
    """
    klass = type(obj)
    for name, attribute in klass.__dict__.items():
        if not name.startswith('__') and \
                (type(attribute) in {staticmethod, classmethod} or not callable(attribute)):
            yield name, attribute

for name, attribute in static_attributes(obj):
    print(name)

输出

static_var
static_method

讨论

  • 此生成器函数生成名称和属性列表,这些名称和属性可以是 staticmethodclassmethod 或 class-level 变量。
  • 我也过滤掉了那些dunder开头的名字(比如__doc__