3 回答
TA贡献1853条经验 获得超18个赞
假设您有一个诸如
>>> class Cls(object):
... foo = 1
... bar = 'hello'
... def func(self):
... return 'call me'
...
>>> obj = Cls()
调用dir该对象会返回该对象的所有属性,包括python特殊属性。尽管某些对象属性是可调用的,例如方法。
>>> dir(obj)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'bar', 'foo', 'func']
您始终可以使用列表理解来过滤掉特殊方法。
>>> [a for a in dir(obj) if not a.startswith('__')]
['bar', 'foo', 'func']
或者您更喜欢地图/过滤器。
>>> filter(lambda a: not a.startswith('__'), dir(obj))
['bar', 'foo', 'func']
如果要过滤掉这些方法,则可以使用内置函数callable作为检查。
>>> [a for a in dir(obj) if not a.startswith('__') and not callable(getattr(obj,a))]
['bar', 'foo']
您还可以检查您的班级与其父班级之间的区别。
>>> set(dir(Cls)) - set(dir(object))
set(['__module__', 'bar', 'func', '__dict__', 'foo', '__weakref__'])
TA贡献2037条经验 获得超6个赞
python中的对象将其属性(包括函数)存储在称为的字典中__dict__。您可以(但通常不应该)使用它直接访问属性。如果您只想要一个列表,也可以调用dir(obj),它返回带有所有属性名称的Iterable,然后可以将其传递给getattr。
但是,需要对变量名称做任何事情通常都是不好的设计。为什么不将它们保存在集合中?
class Foo(object):
def __init__(self, **values):
self.special_values = values
然后,您可以使用 for key in obj.special_values:
添加回答
举报