获取班级变量列表& Python中的方法

时间:2011-04-09 19:30:46

标签: python

如果我有以下课程,获取确切的变量和方法列表的最佳方法是什么,排除超类中的那些?

class Foo(Bar):
  var1 = 3.14159265
  var2 = Baz()
  @property
  def var3(self):
      return 42
  def meth1(self, var):
      return var

我希望元组('var1','var2','var3','meth1')的开销最小。这是在Django环境中运行的,它似乎将一些类实例变量放在只读__dict__变量中;我无法找到复制方法的壮举。

这是我在玩它时看到的,除了从dir()中修剪__*或手动列出它们之外的任何建议?

>>> a=Foo()
>>> a
<__main__.Foo instance at 0x7f48c1e835f0>
>>> dict(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: iteration over non-sequence
>>> dir(a)
['__doc__', '__module__', 'meth1', 'var1', 'var2', 'var3']
>>> a.__dict__
{}

5 个答案:

答案 0 :(得分:8)

如果已知类及其超类,则类似:

tuple(set(dir(Foo)) - set(dir(Bar)))

如果您希望它更通用,您可以使用类似

的内容获取基类列表
bases = Foo.mro()

...然后使用该列表从所有基类中减去属性。

答案 1 :(得分:4)

在您的示例中,a是一个实例,其__dict__将包含其__init__函数中设置的所有变量。要获取所有类变量,请使用a.__class__.__dict__

答案 2 :(得分:3)

第三个答案是inspect module,它与上面的内容相同

答案 3 :(得分:0)

INNER JOIN SUM(a.TotalLeaves + TotalCompOff) AS RemainingLeaves )       

如果要排除内联变量,请在变量的开头和结尾检查__上的名称

答案 4 :(得分:0)

如果你想自省你自己的类,你可以在类定义上做,顺便缓存一下:

class Bar:
    parent_prop = 0


class Foo(Bar):
    my_prop1 = 1
    my_prop2 = 2

    def method1(self):
        pass

    SYMBOLS = [k for k in locals().keys() if not k.startswith('_')]



if __name__ == '__main__':
    print(Foo.SYMBOLS)

输出:

['my_prop1', 'my_prop2', 'method1']