Pythonic способ настроить свойство в шаблоне проектирования моста - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь построить модуль, используя шаблон проектирования «Мост», чтобы отделить абстракцию от его реализации. Мне также нужно свойство try_limit, которое можно динамически изменять при запуске.

После некоторых проб и ошибок я написал bridge.py, который работает, как я ожидал, но мне нужно написать свойство и установщик дважды, в классах Abstraction и Implementor соответственно. Есть ли другой питонский способ сделать это?

bridge.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import abc

class Abstraction(object):
    def __init__(self, imp):
        self._imp = imp

    @property
    def try_limit(self):
        return self._imp.try_limit

    @try_limit.setter
    def try_limit(self, value):
        self._imp.try_limit = value

    def run(self, cmd):
        ret = self._imp.run(cmd)

        return ret


class Implementor(metaclass=abc.ABCMeta):
    def __init__(self):
        self._try_limit = 0

    @property
    def try_limit(self):
        return self._try_limit

    @try_limit.setter
    def try_limit(self, value):
        self._try_limit = value

    @abc.abstractmethod
    def run(self, cmd):
        pass        


class ImpA(Implementor):
    def __init__(self, realtime_display=False):
        super().__init__()

    def run(self, arg):
    # Implement A which use try_limit
    # try_limit can be changed dynamically when running 


class ImpB(Implementor):
    def __init__(self):
        super().__init__()

    def run(self, arg):
    # Implement B which also use try_limit
    # try_limit can be changed dynamically when running

Среда: Python 3.6.3

1 Ответ

0 голосов
/ 27 апреля 2018

После прочтения вики-ссылок, предоставленных Джо, я обнаружил, что могу просто удалить свойство try_limit в классе Implementor, потому что я уже установил try_limit для экземпляра '_imp' напрямую. Спасибо, ответ Джо и Джонршарпа на мой вопрос.

bridge_revised.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import abc

class Abstraction(object):
    def __init__(self, imp):
        self._imp = imp

    @property
    def try_limit(self):
        return self._imp.try_limit

    @try_limit.setter
    def try_limit(self, value):
        self._imp.try_limit = value

    def run(self, cmd):
        ret = self._imp.run(cmd)

        return ret


class Implementor(metaclass=abc.ABCMeta):
    def __init__(self):
        self.try_limit = 0

    @abc.abstractmethod
    def run(self, cmd):
        pass        


class ImpA(Implementor):
    def __init__(self, realtime_display=False):
        super().__init__()

    def run(self, arg):
    # Implement A which use try_limit
    # try_limit can be changed dynamically when running 


class ImpB(Implementor):
    def __init__(self):
        super().__init__()

    def run(self, arg):
    # Implement B which also use try_limit
    # try_limit can be changed dynamically when running

Среда: Python 3.6.3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...