Найти - Пользователи
Полная версия: создание переменной в классе по содержимому строки
Начало » Python для новичков » создание переменной в классе по содержимому строки
1 2
i_am_kisly
пусть есть строка
a = "ololo"

есть класс

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

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

print b.ololo
FishHook
setattr(b, a, 1000)
print b.ololo
i_am_kisly
а как теперь обратиться к этой переменной ?

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

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

я совсем нуб )) только не надо опять этого “на кухню, женщина” а то пишут всякие
Shaman
getattr
i_am_kisly
Спасибо, а если перевернуть задачу ? Есть несколько экземпляров класса, в каждом атрибут с одинаковым названием, но разным значением. как по значению атрибута получить имя класса ? Как я понимаю, надо получить все экземпляры класса (опять же как ?) и перебрать ? или есть друго более простой способ ?
FishHook
class Foo(object):pass
f = Foo()
print f.__class__
i_am_kisly
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
и еще вопрос. в php можно сделать вот так :

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

есть ли аналогичное решение в python
FishHook
# -*- 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
FishHook
i_am_kisly
и еще вопрос. в php можно сделать вот так :
Зачем? Я бы с ума сошел в таком коде ковыряться
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB