我来自C的背景,为了实现一个策略模式,我们总是使用一个接口,例如:ilogger。据我所知,在像Python这样的duck类型的语言中,我们可以避免这个基类/契约。在
我的问题是,这是利用duck类型实现策略模式的最佳方法吗?而且,这种duck-typing方法是否能让我代码的下一个用户明白这是一个“扩展点”?另外,我认为最好使用类型提示来帮助下一个查看代码的人了解策略的类型,但是对于没有基类/契约的duck类型,您使用哪种类型?一个已经很具体的课程?在
下面是一些代码:
class FileSystemLogger():
def log(self, msg):
pass
class ElasticSearchLogger():
def log(self, msg):
pass
# if i wanted to use type hints, which type should logger be here?
class ComponentThatNeedsLogger():
def __init__(self, logger):
self._logger = logger
# should it be this?
class ComponentThatNeedsLogger():
def __init__(self, logger : FileSystemLogger):
self._logger = logger
有人能告诉我什么是最标准的/Python式的/可读的处理方法吗?在
我不是在寻找“这里是答案在2行代码”的答案。在
在Python中,由于运行时安全和优雅的终止,通常不需要具有编译时类型强制的全面策略模式。在
如果希望自定义现有代码的某些部分,通常的做法是:
__call__
的对象);if
/else
中进行测试,或者在某个注册表中查找(无论是对模块是全局的,还是对类或对象的局部的);enum
,但是对于简单的情况,它被认为是太多的缺点而没有好处(在调试时是不可读的,需要样板文件),因为Python在灵活性和可伸缩性方面比C更具灵活性。在如果您真的想一直使用类并强制使用基类,请创建一个ABC: abstract base class / method及其一些实现:
属性:用于查找目的的Alex Vasses answer here
然后使用它们:
^{pr2}$输出:
顺便说一句:python已经具有相当复杂的日志记录能力。如果这是你调查的唯一目的,请调查Logging。在
据我所知,在Python中实现策略模式最常见的方法是传递函数(或可调用函数)。函数是Python中的第一类对象,因此,如果消费者需要的只是一个函数,那么您不需要提供更多的函数。当然,如果你想的话,你可以给它加注释。假设您只想记录字符串:
这允许您动态创建一个简单的记录器:
^{pr2}$但是您也可以利用类的所有功能来创建一个复杂的记录器并只传递相关的方法。在
相关问题 更多 >
编程相关推荐