Как получить переменные экземпляра в Python?

Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int:

int x;
x = 10;

В этом примере переменная x является int, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.

Но когда вы пытаетесь объявить ссылочный тип, произойдет что-то другое. Возьмите следующий код:

Integer num;
num = new Integer(10);

Первая строка объявляет переменную с именем num, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».

Во второй строке ключевое слово new используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования . (точка).

Exception, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num. Перед созданием объекта вы получите NullPointerException. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.

Например, вы можете имеют следующий метод:

public void doSomething(SomeObject obj) {
   //do something to obj
}

В этом случае вы не создаете объект obj, скорее предполагая, что он был создан до вызова метода doSomething. К сожалению, этот метод можно вызвать следующим образом:

doSomething(null);

В этом случае obj имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.

Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething может быть записано как:

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj != null) {
       //do something
    } else {
       //do something else
    }
}

Наконец, Как определить исключение & amp; причина использования Трассировки стека

105
задан ROMANIA_engineer 24 February 2018 в 09:17
поделиться

7 ответов

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

Попытка это

>>> hi_obj = hi()
>>> hi_obj.__dict__.keys()
128
ответ дан cnu 24 November 2019 в 03:56
поделиться

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

class Foo(object):
    def __init__(self):
        self.a = 1
        self.b = 2

vars(Foo()) #==> {'a': 1, 'b': 2}
vars(Foo()).keys() #==> ['a', 'b']
90
ответ дан user136623 24 November 2019 в 03:56
поделиться

Вы обычно не могли давать атрибуты экземпляра просто класс, по крайней мере, не инстанцируя класса. Можно получить атрибуты экземпляра, приведенные, пример, тем не менее, или класс приписывают, учитывая класс. Посмотрите 'осмотреть' модуль. Вы не можете получить список атрибутов экземпляра, потому что экземпляры действительно могут иметь что-либо как атрибут, и - как в Вашем примере - нормальный способ создать их состоит в том, чтобы просто присвоить им в __ init __ метод.

исключение - то, если Ваш класс использует слоты, который является фиксированным списком атрибутов, которые класс позволяет экземплярам иметь. Слоты объяснены в http://www.python.org/2.2.3/descrintro.html , но существуют различные ловушки со слотами; они влияют на расположение памяти, таким образом, множественное наследование может быть проблематичным, и наследование в целом должно принять слоты во внимание, также.

14
ответ дан Thomas Wouters 24 November 2019 в 03:56
поделиться

Можно также протестировать, если объект имеет определенную переменную с:

>>> hi_obj = hi()
>>> hasattr(hi_obj, "some attribute")
10
ответ дан daniel 24 November 2019 в 03:56
поделиться

Предложите

>>> print vars.__doc__
vars([object]) -> dictionary

Without arguments, equivalent to locals().
With an argument, equivalent to object.__dict__.

В otherwords, он по существу просто переносится __ dict __

6
ответ дан martin clayton 24 November 2019 в 03:56
поделиться

Ваш пример показывает "переменные экземпляра", не действительно переменные класса.

Взгляд в 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"

Переменные класса совместно используются всеми экземплярами класса.

5
ответ дан S.Lott 24 November 2019 в 03:56
поделиться

Хотя не непосредственно ответ на вопрос 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 имеет все виды интересных вещей в нем. Это позволяет Вам todo некоторый интересный материал. Вот пример того, как я имею, использовали это:

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'
5
ответ дан tim.tadh 24 November 2019 в 03:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: