获取类的属性

2024-04-27 04:36:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我想得到一个类的属性,比如:

class MyClass():
  a = "12"
  b = "34"

  def myfunc(self):
    return self.a

使用MyClass.__dict__给了我一个属性和函数的列表,甚至是像__module____doc__这样的函数。而MyClass().__dict__给我一个空的dict,除非我显式地设置了该实例的属性值。

我只需要属性,在上面的例子中,这些属性是:ab


Tags: 实例函数self列表docreturn属性def
3条回答
def props(cls):   
  return [i for i in cls.__dict__.keys() if i[:1] != '_']

properties = props(MyClass)

尝试inspect模块。getmembers和各种测试应该是有帮助的。

编辑:

例如

class MyClass(object):
    a = '12'
    b = '34'
    def myfunc(self):
        return self.a

>>> import inspect
>>> inspect.getmembers(MyClass, lambda a:not(inspect.isroutine(a)))
[('__class__', type),
 ('__dict__',
  <dictproxy {'__dict__': <attribute '__dict__' of 'MyClass' objects>,
   '__doc__': None,
   '__module__': '__main__',
   '__weakref__': <attribute '__weakref__' of 'MyClass' objects>,
   'a': '34',
   'b': '12',
   'myfunc': <function __main__.myfunc>}>),
 ('__doc__', None),
 ('__module__', '__main__'),
 ('__weakref__', <attribute '__weakref__' of 'MyClass' objects>),
 ('a', '34'),
 ('b', '12')]

现在,这些特殊的方法和属性让我很紧张——它们可以通过多种方式处理,其中最简单的方法就是根据名称进行过滤。

>>> attributes = inspect.getmembers(MyClass, lambda a:not(inspect.isroutine(a)))
>>> [a for a in attributes if not(a[0].startswith('__') and a[0].endswith('__'))]
[('a', '34'), ('b', '12')]

…其中更复杂的可能包括特殊的属性名检查甚至元类;)

myfuncMyClass的属性。这就是你跑步时的发现:

myinstance = MyClass()
myinstance.myfunc()

它在myinstance上查找名为myfunc的属性,但找不到该属性,看到myinstanceMyClass的实例并在那里查找它。

因此,MyClass完整的属性列表是:

>>> dir(MyClass)
['__doc__', '__module__', 'a', 'b', 'myfunc']

(注意,我使用dir只是作为一种简单快捷的方法来列出类的成员:它应该只以探索的方式使用,而不是在生产代码中使用)

如果只需要特定的属性,则需要使用某些条件筛选此列表,因为__doc____module__myfunc在任何方面都不特殊,它们与ab完全相同。

我从来没有使用过Matt和Borealid提到的inspect模块,但是从一个简短的链接来看,它似乎有一些测试可以帮助您完成这项工作,但是您需要编写自己的谓词函数,因为您需要的大概是那些属性,这些属性不通过isroutine测试,并且不以两个下划线开头和结尾。

另请注意:通过在Python2.7中使用class MyClass():,您正在使用过时的旧式类。除非是为了与非常旧的库兼容而故意这样做,否则应该将类定义为class MyClass(object):。在Python 3中没有“旧式”类,这种行为是默认的。但是,使用newstyle类将获得一个更自动定义的属性:

>>> class MyClass(object):
        a = "12"
        b = "34"
        def myfunc(self):
            return self.a
>>> dir(MyClass)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a', 'b', 'myfunc']

相关问题 更多 >