Найти - Пользователи
Полная версия: динамическое создание и заполнение экземпляров класса
Начало » Python для новичков » динамическое создание и заполнение экземпляров класса
1
sashazz
Здравствуйте, задача такая: в директории есть 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()        
    
doza_and
оборачивайте код в теги <>

Иначе логика вашего скрипта неоднозначна
klas_list.append(der)
точно добавляет не то что перебирает
Обычная идеома
for i in glob.glob("*,*"):
   ....
range тут не нужен
ну и многое другое… По сути ни один из комментариев не соответствует тому, что вы делаете в коде. Вам похоже сначала надо почитать книжку
sashazz
Увы в книжках таково не могу найти - про динамическое создание ни слова. Ну в klas_list.append(der) - видно опечатка - а так в этот List заносятся все названия соответствующие маске r*.txt. От range отказаться не могу - иначе никак не смогу обращаться к экземплярам класса samolet(). насчет тегов извините не знал - но для этого я исходники и приложил. Мне пока главное чтобы скрипт заработал - оптимизацией займусь потом. Повторюсь - вся проблема в том что в экземпляры класса заносятся данные из первого файла (по при этом обрабатываются все файлы)а не из всех из der
doza_and
Это не файл один открывается, это данные в классах совпадают.
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()

sashazz
спасибо что разъяснили, буду перебивать ваш пример (чтобы понять - как это сделать без numPy ) а за вид оформления сор - но мне главное чтобы работало - будет опыт будет и оптимизация
doza_and
sashazz
как это сделать без numPy
Эта постановка задачи мне кажется ошибочной. Numpy есть, ставится на многие платформы, Без него весь ваш код наполнится горой циклов, и станет во много раз медленнее. Зачем?
sashazz
да через pip не ставится (надо ставить еще сторонние библиотеки, а пк еле дышит) - мне главное чтобы работало сразу без плясок - можно и медленно+ задача для учебных целей. но очень большое спасибо за пример хоть с места сдвинусь
doza_and
Это винда компилировать не умеет. скачиваете отсюда http://www.lfd.uci.edu/~gohlke/pythonlibs/ и ставите. pip install numpy…whl никаких особых плясок. Питон без numpy это половина питона.
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