如果我有以下课程,获取确切的变量和方法列表的最佳方法是什么,排除超类中的那些?
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__
{}
答案 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']