Уведомления

Группа в Telegram: @pythonsu

#1 Март 12, 2015 16:27:08

ajk
Зарегистрирован: 2015-01-24
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

как обнулить переменную, точнее класс

Точнее, так. Есть некий класс.
Вот я его использую:

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'
И если я запускаю скрипт по одному файлу, то нормально прокатывает.
А если по каталогу, то разобранные данные каждого файла остаются в памяти и рекурсивно складываются:
строка1
строка1строка2
строка1строка2строка3
строка1строка2строка3строка4

Как?

При выходе из функции file_pars класс же должен обнуляться.

Почему нет?

Спасибо!
Александр.

Офлайн

#2 Март 12, 2015 17:11:21

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

как обнулить переменную, точнее класс

ajk
класс же должен обнуляться
Что такое по вашему класс и что значит его свойство обнуляться?



Офлайн

#3 Март 13, 2015 10:36:20

ajk
Зарегистрирован: 2015-01-24
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

как обнулить переменную, точнее класс

Ну, я как-то некорректно выразился. Перефразирую.

Вот, я исплоьзую класс:

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'
Создается объект book, вкачиваю данные book.list2sql(db, 1)
Тут, как бы, всё работает. На выходе из этой функции нужно уничтожить объект book.
Но он не уничтожается! При следующем вызове в функции следующие данные приплюсовываются к предыдущим! И так пока не надоест. Как?

Спасибо!
Александр.

Офлайн

#4 Март 13, 2015 10:40:21

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

как обнулить переменную, точнее класс

Ну дык объект-то новый остается, а файл вы открываете каждый раз один и тот же. Если десять раз записать в один файл открытый для добавления, то в нем будет результат десяти записей, разве нет?



Офлайн

#5 Март 13, 2015 11:25:50

ajk
Зарегистрирован: 2015-01-24
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

как обнулить переменную, точнее класс

list2sql - список из файла file_name который парсится в объект book, ну, и далее в sql
При каждом вызове функции новый файл и хочется новые sql-ки, но объект book при выходе из функции file_pars не обнуляется (или не удаляется).

И при работе по каталогу разобранные данные каждого файла остаются в памяти и рекурсивно складываются:
строка1
строка1строка2
строка1строка2строка3
строка1строка2строка3строка4

Что я не так объясняю?

Спасибо!
Александр.

Офлайн

#6 Март 13, 2015 13:44:02

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

как обнулить переменную, точнее класс

покажите весь код или хотя бы то место, где вызывается функция



Офлайн

#7 Март 13, 2015 15:30:14

ajk
Зарегистрирован: 2015-01-24
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

как обнулить переменную, точнее класс

Всего там много и путано. Пытаюсь свести к минимуму, что бы показать (или самому увидеть)

Примерно так я перебираю каталог:

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)

Офлайн

#8 Март 13, 2015 15:45:40

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

как обнулить переменную, точнее класс

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()
Скорее всего, где то у тебя лажа в коде, не видя его полностью и без возможности воспроизвести на своей машине помочь тебе не представляется возможным. Или программу целиком, или извини.



Офлайн

#9 Март 13, 2015 17:02:08

ajk
Зарегистрирован: 2015-01-24
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

как обнулить переменную, точнее класс

Что-то я понял…
Я сначала сделал класс так:

class XMLparse(object):
	dict = {}
	def __init__(self, file_xml):
И была рекурсия.
А передвинул dict внутрь конструктора и они стали обнуляться:
class XMLparse(object):
	def __init__(self, file_xml):
		self.dict = {}
А можете пояснить мою неправоту!

Спасибо!
Александр

Офлайн

#10 Март 13, 2015 17:54:49

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

как обнулить переменную, точнее класс

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



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version