在Python中循环一个类的​​所有成员variables

你如何得到一个类可以迭代的所有variables的列表? 有点像当地人(),但是对于一个class级

class Example(object): bool143 = True bool2 = True blah = False foo = True foobar2000 = False def as_list(self) ret = [] for field in XXX: if getattr(self, field): ret.append(field) return ",".join(ret) 

这应该返回

 >>> e = Example() >>> e.as_list() bool143, bool2, foo 
 dir(obj) 

为您提供对象的所有属性。 你需要自己过滤掉方法等成员:

 class Example(object): bool143 = True bool2 = True blah = False foo = True foobar2000 = False example = Example() members = [attr for attr in dir(example) if not callable(getattr(example, attr)) and not attr.startswith("__")] print members 

会给你:

 ['blah', 'bool143', 'bool2', 'foo', 'foobar2000'] 

如果你只想使用variables(没有函数):

 vars(your_object) 

@truppo:你的答案几乎是正确的,但可调用将总是返回false,因为你只是传入一个string。 你需要像下面这样的东西:

 [attr for attr in dir(obj()) if not callable(getattr(obj(),attr)) and not attr.startswith("__")] 

这将过滤掉function

 >>> a = Example() >>> dir(a) ['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'bool143', 'bool2', 'blah', 'foo', 'foobar2000', 'as_list'] 

如你所见,这给你所有的属性,所以你必须过滤掉一点点。 但基本上, dir()是你在找什么。

简单的方法是将类的所有实例保存在list

 a = Example() b = Example() all_examples = [ a, b ] 

物体不会自发地存在。 您的程序的某些部分创build它们是有原因的。 创作是有原因的。 收集他们在列表中也可以完成的原因。

如果你使用工厂,你可以这样做。

 class ExampleFactory( object ): def __init__( self ): self.all_examples= [] def __call__( self, *args, **kw ): e = Example( *args, **kw ) self.all_examples.append( e ) return e def all( self ): return all_examples makeExample= ExampleFactory() a = makeExample() b = makeExample() for i in makeExample.all(): print i 
  class Employee: ''' This class creates class employee with three attributes and one function or method ''' def __init__(self, first, last, salary): self.first = first self.last = last self.salary = salary def fullname(self): fullname=self.first + ' ' + self.last return fullname emp1 = Employee('Abhijeet', 'Pandey', 20000) emp2 = Employee('John', 'Smith', 50000) print('To get attributes of an instance', set(dir(emp1))-set(dir(Employee))) # you can now loop over