假设o是一个Python对象,我想要所有的字段o,没有任何方法或__stuff__.如何才能做到这一点?
我尝试过这样的事情:
[f for f in dir(o) if not callable(f)]
[f for f in dir(o) if not inspect.ismethod(f)]
Run Code Online (Sandbox Code Playgroud)
但这些返回相同dir(o),大概是因为dir给出了一个字符串列表.此外,__class__即使我让这个工作,这里也会返回.
我写一个元类读取类的属性,并将它们存储在列表中,但我想要的清单(cls.columns)尊重声明的顺序(即:mycol2,mycol3,zut,cool,menfin,a在我的例子):
import inspect
import pprint
class Column(object):
pass
class ListingMeta(type):
def __new__(meta, classname, bases, classDict):
cls = type.__new__(meta, classname, bases, classDict)
cls.columns = inspect.getmembers(cls, lambda o: isinstance(o, Column))
cls.nb_columns = len(cls.columns)
return cls
class Listing(object):
__metaclass__ = ListingMeta
mycol2 = Column()
mycol3 = Column()
zut = Column()
cool = Column()
menfin = Column()
a = Column()
pprint.pprint(Listing.columns)
Run Code Online (Sandbox Code Playgroud)
结果:
[('a', <__main__.Column object at 0xb7449d2c>),
('cool', <__main__.Column object at 0xb7449aac>), …Run Code Online (Sandbox Code Playgroud)