Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 10, 2013 10:04:52

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

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

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
обратите внимание:
>>> class Foo(object): key = 0
>>> f = Foo()
>>> f.key
0
>>> Foo.key
0
>>> f.key = 1
>>> f.key
1
>>> Foo.key
0
>>> Foo.key = 2
>>> f.key
1
>>> Foo.key
2
>>> 

Офлайн

#2 Июнь 19, 2013 23:34:10

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

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

еще один вопрос ( к сожалению далеко не последний )

допустим есть некая строка S = ‘penelopa’, как создать класс с именем из этой строки ? мне без гуру не обойтись ((

и как потом к нему обратиться, зная только эту строку

Отредактировано i_am_kisly (Июнь 19, 2013 23:34:48)

Офлайн

#3 Июнь 19, 2013 23:51:38

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

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

Если не секрет, какую задачу вы пытаетесь решить этим и предыдущим способом?



Офлайн

#4 Июнь 19, 2013 23:57:05

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

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

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

Отредактировано i_am_kisly (Июнь 19, 2013 23:58:13)

Офлайн

#5 Июнь 20, 2013 06:01:26

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

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

i_am_kisly
допустим есть некая строка S = ‘penelopa’, как создать класс с именем из этой строки ? мне без гуру не обойтись ((
S = "Penelopa"
globals().update({S: type(S, (), {})})
print Penelopa



Офлайн

#6 Июнь 20, 2013 10:21:02

i_am_kisly
Зарегистрирован: 2013-05-25
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить 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
  
class X(object):
    file = []
    
    def ololo(self):
      
      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"
      
      self.file.append(f)
      self.file.append(g)
      self.file.append(h)
      self.file.append(x)
      self.file.append(y)
      
    #def ololo2(self):
      print self.file
      for instance in Foo.get_by_attr(100500):
	print instance, instance.d
Y = X()
Y.ololo()
#Y.ololo2()

а этот нет ( отрывок ) :
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("file_name")
class excel_file_class(object): pass
class Ui_MainWindow(object):
    
    list_of_files2 = []
    
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(720, 864)
..........................................................................
       
    def open_excel(self):
        
        # если в комбо-боксе установлено 'New', то продолжаем, если нет - ничего не делаем
        if (self.cb_get(self.cb_filename) == 'New') :
            # вызываем QT-Open, получаем путь до файла
            temp_file = self.openFile()
            
            # проверка на отмену Qt Open File
            if temp_file == '' :
                print '__ QT FileOpen __ действие отменено'
                pass
            
            else :
                # если значение не пустое, то 
                # создаем обьект класса excel_file_class
                file_list_temp = excel_file_class()
                
                # заполняем путь до файла               
                file_list_temp.path_to_file = str( temp_file )
                
                # получаем имя файла
                file_list_temp.file_nane = self.int_split( file_list_temp.path_to_file )
                
                # открываем excel файл.
                # 0 - object of book
                # 1 - num of sheet
                # 2 - list of sheet name 
                temp = excel.open_xls(file_list_temp.path_to_file)
                        
                # первый (нулевой) элемент возвращенного списка - обьект книги ( см. выше )
                file_list_temp.object_of_book = temp[0]
                
                # второй (первый) элемент - количество страниц в книге
                file_list_temp.num_of_sheets = temp[1]
                
                # третий (второй) элемент - список имен страниц в книге
                file_list_temp.name_of_sheets = temp[2]        
                
                # добавляем получившийся класс в переменную более высокого уровня
                print self.list_of_files2
                self.list_of_files2.append(file_list_temp)
                
                
                # по идее проверку надо вкорячить где-то тут
                # методом проб, проверка будет по имени.
                
                if file_list_temp.file_nane in self.list_of_files :
                    # сделать всплывающее окно, в следующем релиз-кандидате гы-гы-гы
                    print 'дубликат? Не будет добавлен'
                else :
                    # если значение уникально, то
                    self.list_of_files.append(file_list_temp.file_nane)
                    
                    # добавляем итем в комбобокс
                    self.cb_add(file_list_temp.file_nane, self.cb_filename)
                    
                    #при выборе файла в комбобоксе - обновить комбобокс страниц
                    
                    #тестовый код
                    
                    
                    for instance in excel_file_class.get_by_attr('---.xls'):
                        print instance, instance.name_of_sheets
        else :
                print 'Выберете пункт New'
                    
        print   'end of open_excel'
   

код морально убог , я и сама начинаю путаться.

я просто хочу провести аналогию :

есть класс Ui_MainWindow(object)
в нем атрибут list_of_files2 = ( пустой список )

в функции ( или правильно - методе ? ) я .append'ю к нему класс ( всё как в первом примере ).

НО

                    for instance in excel_file_class.get_by_attr('---.xls'):
                        print instance, instance.name_of_sheets

грязно ругается :

Traceback (most recent call last):
File “/home/me/workspace/new_price/src/main_gui.py”, line 363, in open_excel
for instance in excel_file_class.get_by_attr('—.xls'):
File “/home/me/workspace/new_price/src/main_gui.py”, line 51, in get_by_attr
return [x for x in InstancesList if getattr(x, attr_name) == value]
AttributeError: ‘excel_file_class’ object has no attribute ‘file_name’

попой чувствую, что где-то напутала с пространством имен, но почему ? ведь первый приведенный код работает и еще как !!

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

Офлайн

#7 Июнь 20, 2013 10:36:32

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

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

file_list_temp.file_nane
что за nane?



Офлайн

#8 Июнь 20, 2013 11:48:07

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

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

стыдно ((

Офлайн

#9 Июнь 20, 2013 14:07:56

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

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

тогда может и в декоратор эту твою file_nane (/me посмотрел в словаре что же это такое) нужно писать?

@get_instance_by_attribute("file_name")

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version