Адресация строки имени экземпляра в __init __ (self) в Python - PullRequest
4 голосов
/ 14 января 2009

Я делаю что-то вроде этого:

class Class(object):
    def __init__(self):
        self.var=#new instance name string#   

Как мне сделать метод __ init __ моего экземпляра для использования строки имени экземпляра для 'c'? Скажите в случае:

c=Class()

Я хочу, чтобы c.var равнялся 'c'.

Спасибо за ваши ответы, я реализую постоянство, а класс является классом постоянного объекта. Я хочу, чтобы __ init __ добавлял запись в базу данных, когда:

c=Class()

Тогда предположим:

del c

Позже:

c=Class()

sholuld создайте экземпляр, используя данные из базы данных, если уже существует запись 'c', в противном случае создайте новую запись.


Спасибо за ваши ответы, я реализую постоянство, а класс - это класс постоянного объекта. Я хочу, чтобы __ init __ добавлял запись в базу данных, когда:

c=Class()

Тогда предположим:

del c

Позже:

c=Class()

sholuld создайте экземпляр, используя данные из базы данных, если уже существует запись 'c', в противном случае создайте новую запись.

Ответы [ 9 ]

7 голосов
/ 14 января 2009

Python не имеет переменных, он имеет объектов и имен . Когда вы делаете

c = Class()

вы делаете две вещи:

  1. Создание нового объекта типа Class
  2. Привязка объекта к имени c в текущей области.

Созданный вами объект не имеет понятия "имя переменной" - если позже вы сделаете

a = c

тогда тот же объект доступен точно так же, используя имена a и c. Вы можете удалить имя a, и объект все равно будет существовать.

Если объекты, которые вы создаете, должны иметь имя, лучше всего передать его им явно ,

class Class(object):
    def __init__(self, name):
        self.name = name

var = Class('var')
3 голосов
/ 14 января 2009

Вы не можете сделать это. Причина этого в том, что объект класса создается первым, и только после этого этот объект привязывается к имени экземпляра.

2 голосов
/ 14 января 2009

Я не думаю, что это было бы возможно, потому что присвоение переменной вашего нового экземпляра происходит после того, как объект полностью построен и инициализирован, и поэтому вы не знаете имя переменной, которой оно будет назначено в пределах init метод

2 голосов
/ 14 января 2009

Вы не можете (если не считать невероятных хаков, таких как проверка кадра стека и проверка байт-кода) Может даже не быть быть именем или таких имен может быть несколько. Например, что нужно дать для следующих фрагментов кода:

l = [Class(), Class()]
a=b=c=d=Class()
1 голос
/ 14 января 2009

Для сохранения объектов данных необходимо использовать уникальный идентификатор записи базы данных.

псевдо-код, потому что я не знаю, какой модуль базы данных вы используете

import db # assume this is your db module

class Class(object):
    def __init__(self):
        self.id = None
        self.name = None

    def get_by_id(self, id):
        records = db.execute('select * from table where id=%s' % str(id))
        if records:
            self.id = records[0]['id']
            self.name = records[0]['name']

    def save(self):
        db.execute('update table set name=%s where id=%s' % (self.name, str(self.id)))

Опять же, это псевдокод, техника ввода строк, которую я использую, НЕ рекомендуется, так как она небезопасна, она просто там, чтобы проиллюстрировать, как продолжать использовать классы с БД.

1 голос
/ 14 января 2009

Это проблема масштаба, вы не можете делать то, что просите. Поскольку c будет объявлен вне области действия вашего класса, ваш экземпляр не знает, как он был назван в коде.

Возможно, если вы сможете дать более широкое объяснение того, что вы пытаетесь достичь, лучшее решение можно предложить.

1 голос
/ 14 января 2009

Я не знаю, как получить программный доступ к имени переменной без глубокого размышления и отладчика. Я не думаю, что информация доступна во время выполнения.

Если вы хотите дать экземплярам (уникальное?) Имя, вы, вероятно, должны заставить инициализатор принять дополнительный аргумент.

def __init__(self, name):
    self.name = name

И вызывающий абонент должен передать соответствующее имя:

c = Class("c")
0 голосов
/ 29 января 2010

У меня была такая же мысль несколько лет назад. Это в некотором роде изящная функция, но создатель языка не предоставляет ее. И я думал, что все они глупы, чтобы не открыть эту замечательную особенность.

Но тогда подумайте об этом. Я думаю, что логика невозможна. говорят:

class Class(object):
    def __init__(self):
        self.instance_name.move() # self.instance_name refer to var
    def move(self):
        print "move"

var = Class()

Теперь, если переменная является массивом, это тоже возможно?

var[0] = Class() # i think it will get confused a bit

это то, о чем я думаю, я не думаю, что назначение экземпляра в себя возможно. и на каком-то языке я просто отправил строку экземпляра в объект, а затем использовал eval для выполнения функции

0 голосов
/ 14 января 2009

Это невозможно. Вы, кажется, путаете переменные и объекты.

В любом случае переменная может отсутствовать:

, например

foo(Class())

Class().arbitraryMethod()

или несколько:

a = b = Class()
...