#python #inheritance #python-2.x
#python #наследование #python-2.x
Вопрос:
У меня есть
from abc import ABCMeta, abstractmethod
class Operation(object):
__metaclass__ = ABCMeta
def __init__(self, a, use_sftp):
print "OPERATION"
self.a = a
self.use_sftp = use_sftp
self.y = 5
@abstractmethod
def execute(self):
pass
class OperationExecutor(object):
def __init__(self, a, use_sftp):
print "EXECUTOR"
self.a = a
self.use_sftp = use_sftp
def batatas(self, operation):
op = operation(self.a, self.use_sftp)
return op.execute()
class FTP(Operation):
__metaclass__ = ABCMeta
def __init__(self, a, use_sftp):
print "FTP"
self.op = super(FTP, self).__init__(a, use_sftp)
self.b = 2
self.c = 3
self.x = 10
def execute(self):
if self.use_sftp:
return SFTP(self.a, self.use_sftp).execute()
else:
return LFTP(self.a, self.use_sftp).execute()
class SFTP(FTP):
def execute(self):
return self.a self.b self.c self.x self.y
class LFTP(FTP):
def execute(self):
return self.a * self.b * self.c * self.x * self.y
def main():
executor = OperationExecutor(1, True)
print executor.batatas(FTP)
if __name__ == '__main__':
main()
я хочу выполнить в следующем порядке:
ИСПОЛНИТЕЛЬ, FTP, ОПЕРАЦИЯ
или аналогичный, но у меня есть следующее:
ИСПОЛНИТЕЛЬ, FTP, ОПЕРАЦИЯ, FTP, ОПЕРАЦИЯ
Это потому, что «init» вызывается дважды. Я не хочу, чтобы «инициализация» выполнялась более одного раза
Операция (отец) —> FTP (дочерний) —> SFTP / LFTP (внук)
Комментарии:
1. Как вы представляете себе запуск
__init__
только один раз, когда вы специально создаете два объекта класса? Это противоречие.2. Используете ли вы Python 2? Вы почти наверняка должны пометить его тегом Python-2, Python 2 находится за пределами его срока службы, и предполагается, что вы будете использовать Python 3, если не указано иное, в настоящее время.
3. возможно, вам следует использовать
FTP
только asFactory
для созданияSFTP
orLFTP
. Википедия: Фабричный шаблон