Вопрос

Есть ли в Python встроенный метод для получения массива всех переменных экземпляра класса?Например, если у меня есть этот код:

class hi:
  def __init__(self):
    self.ii = "foo"
    self.kk = "bar"

Есть ли способ сделать это:

>>> mystery_method(hi)
["ii", "kk"]

Редактировать:Изначально я ошибочно запросил переменные класса.

Это было полезно?

Решение

Каждый объект имеет __dict__ переменная, содержащая все переменные и их значения.

Попробуй это

>>> hi_obj = hi()
>>> hi_obj.__dict__.keys()

Другие советы

Используйте варс()

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"

Переменные класса являются общими для всех экземпляров класса.

Хотя это и не является прямым ответом на вопрос ОП, существует довольно приятный способ узнать, какие переменные находятся в области видимости функции.взгляните на этот код:

>>> 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'
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top