桥梁设计模式中属性设置的python方法

桥梁设计模式中属性设置的python方法,python,design-patterns,Python,Design Patterns,我正在尝试使用“桥接”设计模式构建一个模块,以将抽象与其实现解耦。我还需要一个属性try\u limit,它可以在运行时动态更改 经过一些尝试和错误之后,我编写了bridge.py,这正如我所期望的那样工作,但是我需要分别在抽象和实现者类中编写属性和setter两次。还有其他类似蟒蛇的方法吗 bridge.py #!/usr/bin/env python3 # -*- coding: utf-8 -*- import abc class Abstraction(object): def

我正在尝试使用“桥接”设计模式构建一个模块,以将抽象与其实现解耦。我还需要一个属性
try\u limit
,它可以在运行时动态更改

经过一些尝试和错误之后,我编写了
bridge.py
,这正如我所期望的那样工作,但是我需要分别在
抽象
实现者
类中编写属性和setter两次。还有其他类似蟒蛇的方法吗

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
#!/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

阅读Joe提供的wiki链接后,我发现我可以在
Implementor
类中删除属性
try\u limit
,因为我已经直接将
try\u limit
设置为实例'\u imp'。感谢Joe&Jonrsharpe对我问题的回答

bridge\u修订版.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
#!/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

您看到了吗?不,我在这里使用示例: