Уведомления

Группа в Telegram: @pythonsu

#1 Июль 18, 2012 15:01:01

andreiru
От:
Зарегистрирован: 2010-11-06
Сообщения: 154
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с классами

Здравствуйте!

Пишу что-то вроде бд которая крутиться в оперативной памяти
(just for fun)

#!/usr/bin/python
# -*- coding: utf-8 -*-
class File:
	def __init__(self, **kwargs):
		for k, v in kwargs.items():
			setattr(self, k, v)
		
	def getHost(self):
		return FileDb.hosts[self.host_id]
class Host:
	__slots__ = ('id', 'name', 'enc', 'paths', 'files', )
	files = []
	def __init__(self, **kwargs):
		for k, v in kwargs.items():
			setattr(self, k, v)
	
	def addFile(self, fullname, size):
		# parsing fullname
		path, name = fullname.rsplit('/', 1)
		if '.' in name: name, ext = name.rsplit('.', 1)
		else: ext = None
		file_inst = File(
			name = name,
			ext = ext,
			size = size
		)
		
		self.files.append(file_inst)
		
		return file_inst
		
	def countFiles(self):
		return len(self.files)
		
		
class FileDb:
	hosts = {}
	
	def __init__(self):
		for x in range(5):
			self.hosts[x] = Host(
				id=x,
				name='name_%s.ru' % x
			)
	
	def getHost(self, id):
		try:
			return self.hosts[id]
		except KeyError:
			pass
			
	def countFiles(self):
		res = 0
		for id in self.hosts:
			res += self.hosts[id].countFiles()
		return res
		
db = FileDb()
db.getHost(1).addFile('/fdg/dgfdf/dfg.txt',565)
print db.countFiles()# выводит 5, т.е к каждому хосту был добавлен файл

Объясните пожалуйста почему при добавлении файла, он добавляется ко всем хостам ?



Отредактировано andreiru (Июль 18, 2012 15:05:17)

Прикреплённый файлы:
attachment test.py (1,1 KБ)

Офлайн

#2 Июль 18, 2012 15:12:17

GaiveR
От:
Зарегистрирован: 2011-08-13
Сообщения: 122
Репутация: +  16  -
Профиль   Отправить e-mail  

Проблема с классами

Потому что files у вас объявлен на уровне класса. Таким образом все объекты используют один список.

Исправить можно так:

class Host:
	__slots__ = ('id', 'name', 'enc', 'paths', 'files', )
	
	def __init__(self, **kwargs):
		self.files = []
		for k, v in kwargs.items():
			setattr(self, k, v)



Офлайн

#3 Июль 18, 2012 15:34:44

andreiru
От:
Зарегистрирован: 2010-11-06
Сообщения: 154
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с классами

GaiveR, спасибо, понял ошибку!



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version