Как получить переменные экземпляра в Python?
есть ли встроенный способ в Python, чтобы получить массив всех переменных экземпляра класса? Например, если у меня есть этот код:
class hi:
def __init__(self):
self.ii = "foo"
self.kk = "bar"
есть ли способ для меня сделать это:
>>> mystery_method(hi)
["ii", "kk"]
Edit: я изначально просил переменные класса ошибочно.
8 ответов:
каждый объект имеет
__dict__переменная, содержащая все переменные и их значения в ней.попробуй такое
>>> 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']
обычно вы не можете получить атрибуты экземпляра, заданные только классом, по крайней мере, без создания экземпляра класса. Однако вы можете получить атрибуты экземпляра, заданные экземпляром, или атрибуты класса, заданные классом. Увидеть "инспекции" модуль. Вы не можете получить список атрибутов экземпляра, потому что экземпляры действительно могут иметь что-либо в качестве атрибута, и-как в вашем примере-обычный способ их создания-просто назначить им в методе __init__.
исключение, если ваш класс использует слоты, которые представляют собой фиксированный список атрибутов, которые класс позволяет иметь экземплярам. Слоты объясняются в http://www.python.org/2.2.3/descrintro.html, но есть различные подводные камни с слотами; они влияют на макет памяти, поэтому множественное наследование может быть проблематичным, и наследование в целом также должно учитывать слоты.
оба метода 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
вы также можете проверить, если объект имеет определенную переменную с:
>>> hi_obj = hi() >>> hasattr(hi_obj, "some attribute")
предлагаю
>>> print vars.__doc__ vars([object]) -> dictionary Without arguments, equivalent to locals(). With an argument, equivalent to object.__dict__.другими словами, он по существу просто обертывает _ _ dict__
ваш пример показывает "переменные экземпляра", а не переменные класса.
посмотреть в
hi_obj.__class__.__dict__.items()для переменных класса, наряду с другими другими членами класса, такими как функции-члены и содержащий модуль.class Hi( object ): class_var = ( 23, 'skidoo' ) # class variable def __init__( self ): self.ii = "foo" # instance variable self.jj = "bar"переменные класса являются общими для всех экземпляров класса.
хотя это не прямой ответ на вопрос OP, есть довольно приятный способ узнать, какие переменные находятся в области действия в функции. взгляните на этот код:
>>> 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'
Comments