Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 2, 2013 15:49:28

i_am_kisly
Зарегистрирован: 2013-05-25
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

создание переменной в классе по содержимому строки

пусть есть строка

a = "ololo"

есть класс

class wtf :
   def  gg(self):
        print "Всем заранее спасибо"
   key = 0
        
b = wtf()

как создать новую переменную принадлежащую b так чтобы ее называние бралось из а ?

print b.ololo

Отредактировано i_am_kisly (Июнь 2, 2013 15:57:29)

Офлайн

#2 Июнь 2, 2013 16:01:44

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

создание переменной в классе по содержимому строки

setattr(b, a, 1000)
print b.ololo



Офлайн

#3 Июнь 8, 2013 20:41:50

i_am_kisly
Зарегистрирован: 2013-05-25
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

создание переменной в классе по содержимому строки

а как теперь обратиться к этой переменной ?

допустим такая вот ситуация :

#изначально не знаем содержимого a
a = 'ololo'
class B():
    def add_new_attr(self, var):
        self.var = var
        setattr(self, self.var, '100500')
        # как теперь обратится к только что созданной переменной в этом шаблоне класса
        print self.  ? #мы ведь не знаем что ей было назначено имя ololo

я совсем нуб )) только не надо опять этого “на кухню, женщина” а то пишут всякие

Отредактировано i_am_kisly (Июнь 8, 2013 20:42:20)

Офлайн

#4 Июнь 8, 2013 21:12:52

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

создание переменной в классе по содержимому строки

getattr

Офлайн

#5 Июнь 10, 2013 00:05:33

i_am_kisly
Зарегистрирован: 2013-05-25
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

создание переменной в классе по содержимому строки

Спасибо, а если перевернуть задачу ? Есть несколько экземпляров класса, в каждом атрибут с одинаковым названием, но разным значением. как по значению атрибута получить имя класса ? Как я понимаю, надо получить все экземпляры класса (опять же как ?) и перебрать ? или есть друго более простой способ ?

Офлайн

#6 Июнь 10, 2013 05:58:42

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

создание переменной в классе по содержимому строки

class Foo(object):pass
f = Foo()
print f.__class__



Офлайн

#7 Июнь 10, 2013 08:07:55

i_am_kisly
Зарегистрирован: 2013-05-25
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

создание переменной в классе по содержимому строки

class Foo(object):
    key = 0
    pass
f = Foo()
f.key = 1
g = Foo()
f.key = 2
h = Foo()
f.key = 3
j =  = Foo()
f.key = 4
...
x = Foo()
f.key = 100500

теперь как получить экземпляр класса, если знаем, что его key = 100500

Отредактировано i_am_kisly (Июнь 10, 2013 08:15:16)

Офлайн

#8 Июнь 10, 2013 08:11:33

i_am_kisly
Зарегистрирован: 2013-05-25
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

создание переменной в классе по содержимому строки

и еще вопрос. в php можно сделать вот так :

$name = 'name_too'
$$name = 'name_two'
print $name_too

есть ли аналогичное решение в python

Офлайн

#9 Июнь 10, 2013 08:46:34

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

создание переменной в классе по содержимому строки

# -*- coding:utf-8 -*-
InstancesList = dict()
def get_instance_by_attribute(attr_name):
    class wrapper(object):
        def __init__(self, cls):
            self.cls = cls
            setattr(cls, "get_by_attr", self.get_by_attr)
        def __call__(self, *args, **kwargs):
            instance = self.cls(*args, **kwargs)
            InstancesList.setdefault(self.cls, list()).append(instance)
            return instance
        def get_by_attr(self, value):
            return [x for x in InstancesList[self.cls] if getattr(x, attr_name) == value]
    return wrapper
@get_instance_by_attribute("key")
class Foo(object):
    pass
f = Foo()
f.key = 1
f.d = 1
g = Foo()
g.key = 2
g.d = "ff"
h = Foo()
h.key = 3
h.d = False
j = Foo()
j.key = 4
j.d = 5.77
x = Foo()
x.key = 100500
x.d = 123
y = Foo()
y.key = 100500
y.d = "Bar"
for instance in Foo.get_by_attr(100500):
    print instance, instance.d



Офлайн

#10 Июнь 10, 2013 08:48:30

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

создание переменной в классе по содержимому строки

i_am_kisly
и еще вопрос. в php можно сделать вот так :
Зачем? Я бы с ума сошел в таком коде ковыряться



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version