Форум сайта python.su
0
Точнее, так. Есть некий класс.
Вот я его использую:
def file_pars (db, file_name) book = XMLparse(file_name) (OK, file, mess) = book.list2sql(db, 1) # del book print '------------------------------------',sys.getrefcount (book) if OK : print 'Загружено: ', file, mess, '\n' else : print 'Ошибка: ', file, mess, '\n'
Офлайн
568
ajkЧто такое по вашему класс и что значит его свойство обнуляться?
класс же должен обнуляться
Офлайн
0
Ну, я как-то некорректно выразился. Перефразирую.
Вот, я исплоьзую класс:
def file_pars (db, file_name) book = XMLparse(file_name) (OK, file, mess) = book.list2sql(db, 1) # del book print '------------------------------------',sys.getrefcount (book) if OK : print 'Загружено: ', file, mess, '\n' else : print 'Ошибка: ', file, mess, '\n'
Офлайн
568
Ну дык объект-то новый остается, а файл вы открываете каждый раз один и тот же. Если десять раз записать в один файл открытый для добавления, то в нем будет результат десяти записей, разве нет?
Офлайн
0
list2sql - список из файла file_name который парсится в объект book, ну, и далее в sql
При каждом вызове функции новый файл и хочется новые sql-ки, но объект book при выходе из функции file_pars не обнуляется (или не удаляется).
И при работе по каталогу разобранные данные каждого файла остаются в памяти и рекурсивно складываются:
строка1
строка1строка2
строка1строка2строка3
строка1строка2строка3строка4
Что я не так объясняю?
Спасибо!
Александр.
Офлайн
568
покажите весь код или хотя бы то место, где вызывается функция
Офлайн
0
Всего там много и путано. Пытаюсь свести к минимуму, что бы показать (или самому увидеть)
Примерно так я перебираю каталог:
def parse_dir(fn): dirlist = os.listdir(fn) dirlist.sort() for i in dirlist: file_pars(os.path.join(fn, i))
Отредактировано ajk (Март 13, 2015 15:32:17)
Офлайн
568
ajk,
понимаешь, то что ты говоришь про “необнуляемый класс” - это ересь. Попробуй вот такой код.
import random class Book(object): def __init__(self): print "Create new class instance" self.i = random.random() def some(): book = Book() print book.i for _ in xrange(10): some()
Офлайн
0
Что-то я понял…
Я сначала сделал класс так:
class XMLparse(object): dict = {} def __init__(self, file_xml):
class XMLparse(object): def __init__(self, file_xml): self.dict = {}
Офлайн
568
ajkКонечно, могу. Я то думал, что XMLparse в твоём коде - это библиотечный класс. Когда ты объявляешь переменную не внутри метода, то она становится атрибутом класса, а не объекта. Класс, понятно, при создании нового объекта каждый раз один и тот же. Образно говоря, это глобальная переменная в пространстве имен класса. Изменяя атрибут класса, ты изменяешь его глобально для программы.
А можете пояснить мою неправоту!
# -*-coding:utf-8-*- import random class Book(object): some_class_attr = "I am class attr" # Это атрибут класса def __init__(self, i): self.some_object_attr = i # Это атрибут объекта self.some_class_attr = "I am attr of b%s" % i # Это ТОЖЕ(!!!!!) атрибут объекта b1 = Book(1) b2 = Book(2) print b1.some_object_attr, b1.some_class_attr print b2.some_object_attr, b2.some_class_attr print Book.some_class_attr Book.some_class_attr = "I am class attr, motherfucker" print Book.some_class_attr print b1.some_class_attr print b2.some_class_attr
Офлайн