Python获取class属性名

在Python中,我们可以通过使用内置函数dir()来获取一个对象的所有属性和方法。但是,如果我们想要获取一个类的所有属性名,而不是实例对象的属性名,该如何实现呢?本文将介绍几种方法来获取Python中类的属性名。

方法一:使用dir()

dir()函数返回一个包含对象所有属性和方法名的列表。我们可以通过将类作为参数传递给dir()函数来获取类的属性名。

class MyClass:
    a = 1
    b = 2

print(dir(MyClass))

输出:

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a', 'b']

在上面的例子中,我们定义了一个名为MyClass的类,并在其中定义了两个属性ab。通过使用dir()函数来获取MyClass的属性名列表。

可以看到,dir(MyClass)返回了一个包含所有属性和方法名的列表。其中,ab是我们定义的属性。

这种方法的缺点是,dir()函数返回的列表包含了类的所有属性和方法,包括一些Python内置的属性和方法,因此需要进行过滤。

方法二:使用vars()

vars()函数返回一个包含对象的属性和属性值的字典。与dir()函数不同的是,vars()函数返回的是实例对象的属性,而不是类的属性。然而,我们可以通过将类作为参数传递给vars()函数来获取类的属性字典,并从中提取属性名。

class MyClass:
    a = 1
    b = 2

print(list(vars(MyClass).keys()))

输出:

['__module__', 'a', 'b', '__dict__', '__weakref__', '__doc__']

在上面的例子中,我们通过使用vars()函数来获取MyClass的属性字典,并使用keys()方法来提取属性名。

可以看到,vars(MyClass).keys()返回了一个包含属性名的列表。其中,ab是我们定义的属性。

需要注意的是,这种方法返回的属性名列表包含了一些特殊的属性,如__module____dict__等,需要进行过滤。

方法三:使用inspect模块

inspect模块提供了一些用于获取类和对象信息的函数。其中,getmembers()函数可以返回一个对象的属性和属性值的列表。通过使用getmembers()函数,我们可以获取类的属性名。

import inspect

class MyClass:
    a = 1
    b = 2

print([name for name, value in inspect.getmembers(MyClass) if not name.startswith('__')])

输出:

['a', 'b']

在上面的例子中,我们通过使用inspect.getmembers()函数来获取MyClass的属性和属性值的列表。然后,我们使用列表推导式来提取属性名。

需要注意的是,这种方法返回的属性名列表不包含特殊属性,如__module____dict__等,无需进行过滤。

方法四:使用元类

元类是Python中一种高级特性,它允许我们在定义类时动态地修改类的行为。我们可以通过定义一个元类,在元类的__new__()方法中获取类的属性名。

class MyMeta(type):
    def __new__(cls, name, bases, attrs):
        print(list(attrs.keys()))
        return super().__new__(cls, name, bases, attrs)

class MyClass(metaclass=MyMeta):
    a = 1
    b = 2

输出:

['__module__', 'a', 'b', '__qualname__']

在上面的例子中,我们定义了一个名为MyMeta的元类,并在元类的__new__()方法中打印了类的属性名列表。然后,我们定义了一个名为MyClass的类,并指定了元类为MyMeta

可以看到,MyMeta__new__()