Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 23, 2015 16:57:02

sashazz
Зарегистрирован: 2012-09-13
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

динамическое создание и заполнение экземпляров класса

Здравствуйте, задача такая: в директории есть r*.txt структуры 1стр: название 2+стр: минута , координаты x, y, z (разбиты пробелами). файлы должны быть загружены в класс samolet() - но у меня проблема - во все экземпляры пишется содержимое 1 файла - но найти ошибку не могу все проходит нормально до (__1__) но отследить не могу в чем ошибка. прилагаю все файлы проекта

def main():
    import glob # для работы с директорией
    der = glob.glob("r*.txt")#все файлы r.txt
    klas_list = []# список всех классов
    for i in range(0,len(der)):# перебор всех текстовых файлов
                klas_list.append(der[i])# добавление классов в список
                klas_list[i] = samolet() # создаем экземпляр класса и вносим его в лист
                for st in open(der[i]): # заполняем экземпляр класса
                        klas_list[i].data.append(st.split()) # тут вводятся разбитые данные (__1__)
## блок проверки__________________________________________
    for q in range (0,len(klas_list)):
        print(klas_list[q].name()," - рейсы",q)
    print(der,"файлы в директории")
    print(klas_list,"имена классов")
    print(klas_list[0].name(),"1class")
    print(klas_list[1].name(),"2class")
    print(klas_list[2].name(),"3class")
    
##______________________________________________________
class samolet():
    def __init__(self,d=[]):
        self.data = d#лист данных(по строчно
        
    def name(self):
        return self.data[0]    
        
    def pos_x(self,t):# возращает кординату х для времени т
        return self.data[t][1]
    
    def pos_y(self,t):# возращает кординату у для времени т
        return self.data[t][2]
    
    def pos_z(self,t):#возращает кординату z для времени т
        return(self.data[t][3])
        
        
        
if __name__ == "__main__":
    main()        
    

Отредактировано sashazz (Авг. 24, 2015 10:37:54)

Прикреплённый файлы:
attachment samolet.rar (2,0 KБ)

Офлайн

#2 Авг. 23, 2015 21:29:19

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

динамическое создание и заполнение экземпляров класса

оборачивайте код в теги <>

Иначе логика вашего скрипта неоднозначна

klas_list.append(der)
точно добавляет не то что перебирает
Обычная идеома
for i in glob.glob("*,*"):
   ....
range тут не нужен
ну и многое другое… По сути ни один из комментариев не соответствует тому, что вы делаете в коде. Вам похоже сначала надо почитать книжку



Офлайн

#3 Авг. 24, 2015 10:34:05

sashazz
Зарегистрирован: 2012-09-13
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

динамическое создание и заполнение экземпляров класса

Увы в книжках таково не могу найти - про динамическое создание ни слова. Ну в klas_list.append(der) - видно опечатка - а так в этот List заносятся все названия соответствующие маске r*.txt. От range отказаться не могу - иначе никак не смогу обращаться к экземплярам класса samolet(). насчет тегов извините не знал - но для этого я исходники и приложил. Мне пока главное чтобы скрипт заработал - оптимизацией займусь потом. Повторюсь - вся проблема в том что в экземпляры класса заносятся данные из первого файла (по при этом обрабатываются все файлы)а не из всех из der

Офлайн

#4 Авг. 24, 2015 21:36:31

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

динамическое создание и заполнение экземпляров класса

Это не файл один открывается, это данные в классах совпадают.

class samolet():
    def __init__(self,d=[]):
        self.data = d#лист данных(по строчно
Питон когда видит определение функции создает значение для аргумента по умолчанию - пустой список.
Далее в цикле:
klas_list[i] = samolet()
Он видит - аргумента нет. Производит инициализацию по умолчанию. А именно тем единственным списком который создал при чтении определения класса.
Поэтому все данные вы запихиваете в один массив, разделяемый во всех экземплярах класса samolet. Это кстати обычная техника для python Аналог static из C++.

Ваш код сильно режет мой глаз. Может так:
#!/bin/env/python
# -*- coding:utf-8 -*-
import numpy as np
import glob # для работы с директорией
def main():
    klas_list = [samolet(i) for i in glob.glob("r*.txt")]# список всех классов
## блок проверки__________________________________________
    print(klas_list)
class samolet():
    def __init__(self,file_name):
        with open(file_name,"r") as f:
            self.name, tmp, self.tag = f.readline().split()
            self.data = np.loadtxt(f)
        self.pos_x, self.pos_x, self.pos_x,tmp = self.data.T
    def __repr__(self):
        return self.name+" \n"+str(self.data)
if __name__ == "__main__":
    main()



Отредактировано doza_and (Авг. 24, 2015 23:53:15)

Офлайн

#5 Авг. 25, 2015 17:19:52

sashazz
Зарегистрирован: 2012-09-13
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

динамическое создание и заполнение экземпляров класса

спасибо что разъяснили, буду перебивать ваш пример (чтобы понять - как это сделать без numPy ) а за вид оформления сор - но мне главное чтобы работало - будет опыт будет и оптимизация

Офлайн

#6 Авг. 25, 2015 17:25:39

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

динамическое создание и заполнение экземпляров класса

sashazz
как это сделать без numPy
Эта постановка задачи мне кажется ошибочной. Numpy есть, ставится на многие платформы, Без него весь ваш код наполнится горой циклов, и станет во много раз медленнее. Зачем?



Офлайн

#7 Авг. 25, 2015 17:50:26

sashazz
Зарегистрирован: 2012-09-13
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

динамическое создание и заполнение экземпляров класса

да через pip не ставится (надо ставить еще сторонние библиотеки, а пк еле дышит) - мне главное чтобы работало сразу без плясок - можно и медленно+ задача для учебных целей. но очень большое спасибо за пример хоть с места сдвинусь

Отредактировано sashazz (Авг. 25, 2015 18:13:35)

Офлайн

#8 Авг. 25, 2015 23:05:41

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

динамическое создание и заполнение экземпляров класса

Это винда компилировать не умеет. скачиваете отсюда http://www.lfd.uci.edu/~gohlke/pythonlibs/ и ставите. pip install numpy…whl никаких особых плясок. Питон без numpy это половина питона.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version