Форум сайта python.su
В ходе разработки возникли архитектурные проблемы. Прошу помощи в их решении.
Имеется два метода: mine() и gather(). Оба метода нужны для получения данных,
разница в том, что у методов разные методы connect и разный способ обработки данных.
Для программиста оба метода одинаковы по своему назначению - получение данных, по
этому я хочу их реализовать в одном модуле data, чтобы можно было использовать
следующим образом:
print data().mine()
print data().gather()
Для этого решил использовать разные классы:
class mine:
def mine(self):
return 'mine'
class gather:
def mine(self):
return 'gather'
class data(mine,gather):
pass
print data().mine()
print data().gather()
class mine:
def __init__(self):
print 'mine init'
def mine(self):
return 'I am "mine"'
def __del__(self):
return 'mine destroyed'
class gather:
def __init__(self):
print 'gather init'
def gather(self):
return 'gather'
def __del__(self):
return 'gather destroyed'
class data(mine,gather):
pass
print data().mine()
print data().gather()
mine init
I am "mine"
mine init
gather << init не того модуля, что я ожидаю, а del вообще не сработал
Офлайн
>>> data.__mro__
5: (<class '__main__.data'>,
<class '__main__.mine'>,
<class '__main__.gather'>,
<type 'object'>)
Отредактировано (Июнь 29, 2011 23:12:33)
Офлайн
Я бы сделал отдельную сущность Connection и оформил ее как Singleton и не заморачивался бы с множественным наследованием.
Если у вас есть архитектурная проблема и вы решили использовать множественное наследование, то у вас теперь 2 архитектурные проблемы :)
Вот как-то так, например:
#!/usr/bin/python
import time
def singleton(cls):
instances = {}
def getinstance():
if cls not in instances:
instances[cls] = cls()
return instances[cls]
return getinstance
@singleton
class Connection():
def __init__(self):
print 'connection init'
class Mine:
def __init__(self):
print 'mine init'
self.connection = Connection()
def mine(self):
return 'I am "mine" %s' % str(self.connection)
class Gather:
def __init__(self):
print 'gather init'
self.connection = Connection()
def gather(self):
return 'I am "gather" %s' % str(self.connection)
def __del__(self):
return 'gather destroyed'
class Data():
def __init__(self):
self._gather = None
self._mine = None
def gather(self):
self._gather = self._gather or Gather()
return self._gather.gather()
def mine(self):
self._mine = self._mine or Mine()
return self._mine.mine()
def gather_first():
print '==== Calling gather() first, then mine()'
data = Data()
print data.gather()
print data.mine()
def mine_first():
print '==== Calling mine() first, then gather()'
data = Data()
print data.mine()
print data.gather()
if __name__ == '__main__':
gather_first()
mine_first()
Офлайн