【问题标题】:Get the list of a class's variables & methods in Python在 Python 中获取类的变量和方法列表
【发布时间】:2011-04-09 19:30:46
【问题描述】:

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

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__
{}

【问题讨论】:

标签: python


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    def getVariablesClass(inst):
    var = []
    cls = inst.__class__
    for v in cls.__dict__:
        if not callable(getattr(cls, v)):
            var.append(v)
    
    return var
    

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

    【讨论】:

      【解决方案3】:

      如果类及其超类是已知的,类似于:

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

      如果你想让它更通用,你可以使用类似的东西获取基类列表

      bases = Foo.mro()
      

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

      【讨论】:

      • 我将在我的项目中使用您的技术,因为基类是可预测的。我还将实现一些缓存例程并将其保存为方法变量,感谢设置操作提示!
      • 请记住,mro() 仅适用于新型类,即。那些来自“对象”的子类
      【解决方案4】:

      第三个答案是inspect module,其作用与上述相同

      【讨论】:

        【解决方案5】:

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

        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']
        

        【讨论】:

          猜你喜欢
          • 2019-02-23
          • 2010-12-27
          • 2011-02-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-01
          • 2011-02-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多