如何在Python中获取实例variables?
有没有在Python中的内置方法来获取所有类的实例variables的数组? 例如,如果我有这个代码:
class hi: def __init__(self): self.ii = "foo" self.kk = "bar"
有没有办法让我这样做:
>>> mystery_method(hi) ["ii", "kk"]
多谢你们!
编辑:我原本是错误地要求类variables。 感谢所有提请我注意的人!
每个对象都有一个__dict__
variables,其中包含所有variables及其值。
尝试这个
>>> hi_obj = hi() >>> hi_obj.__dict__.keys()
使用vars()
class Foo(object): def __init__(self): self.a = 1 self.b = 2 vars(Foo()) #==> {'a': 1, 'b': 2} vars(Foo()).keys() #==> ['a', 'b']
通常情况下,不能获得仅给定类的实例属性,至less不能实例化类。 虽然给定一个实例可以获得实例属性,或者给出一个类的类属性。 参见“检查”模块。 你不能得到一个实例属性的列表,因为实例实际上可以有任何东西作为属性,并且 – 正如你的例子 – 创build它们的正常方式是只在__init__方法中分配给它们。
例外情况是,如果您的课程使用插槽,这是类允许实例具有的固定的属性列表。 老虎机在http://www.python.org/2.2.3/descrintro.html里有解释,但是老虎机有很多缺陷。; 它们影响内存布局,所以多重inheritance可能会产生问题,一般来说inheritance也必须考虑到插槽。
Vars()和dict方法都适用于OP发布的示例,但它们不适用于“松散”定义的对象,如:
class foo: a = 'foo' b = 'bar'
要打印所有不可调用的属性,可以使用以下函数:
def printVars(object): for i in [v for v in dir(object) if not callable(getattr(object,v))]: print '\n%s:' % i exec('print object.%s\n\n') % i
你也可以testing一个对象是否有一个特定的variables:
>>> hi_obj = hi() >>> hasattr(hi_obj, "some attribute")
build议
>>> print vars.__doc__ vars([object]) -> dictionary Without arguments, equivalent to locals(). With an argument, equivalent to object.__dict__.
换句话说,它本质上只是包装__dict__
虽然不是直接回答OP问题,但是find一个函数中的variables是一个很好的方法。 看看这个代码:
>>> def f(x, y): z = x**2 + y**2 sqrt_z = z**.5 return sqrt_z >>> f.func_code.co_varnames ('x', 'y', 'z', 'sqrt_z') >>>
func_code属性里面有各种有趣的东西。 它可以让你做一些很酷的东西。 这里是我如何使用这个例子:
def exec_command(self, cmd, msg, sig): def message(msg): a = self.link.process(self.link.recieved_message(msg)) self.exec_command(*a) def error(msg): self.printer.printInfo(msg) def set_usrlist(msg): self.client.connected_users = msg def chatmessage(msg): self.printer.printInfo(msg) if not locals().has_key(cmd): return cmd = locals()[cmd] try: if 'sig' in cmd.func_code.co_varnames and \ 'msg' in cmd.func_code.co_varnames: cmd(msg, sig) elif 'msg' in cmd.func_code.co_varnames: cmd(msg) else: cmd() except Exception, e: print '\n-----------ERROR-----------' print 'error: ', e print 'Error proccessing: ', cmd.__name__ print 'Message: ', msg print 'Sig: ', sig print '-----------ERROR-----------\n'
你的例子显示“实例variables”,而不是真正的类variables。
查看hi_obj.__class__.__dict__.items()
作为类variables,以及其他类成员,如成员函数和包含模块。
class Hi( object ): class_var = ( 23, 'skidoo' ) # class variable def __init__( self ): self.ii = "foo" # instance variable self.jj = "bar"
类variables由类的所有实例共享。