Python 在类的各种底层实现之间进行选择
假设已经存在一些不同的抽象python实现。对于确定性,假设我们有各种表示四元数的类,它们具有大致相同的标准功能(方法、变量) 在我的项目中,我希望用户能够选择这个抽象的特定底层实现。同时,我希望我的大部分代码都以独立于特定底层实现的方式实现 我想,一种解决方案是创建我自己的类(通过选择特定实现的参数实例化),在该类中进行选择 Smth是这样的:Python 在类的各种底层实现之间进行选择,python,python-3.x,Python,Python 3.x,假设已经存在一些不同的抽象python实现。对于确定性,假设我们有各种表示四元数的类,它们具有大致相同的标准功能(方法、变量) 在我的项目中,我希望用户能够选择这个抽象的特定底层实现。同时,我希望我的大部分代码都以独立于特定底层实现的方式实现 我想,一种解决方案是创建我自己的类(通过选择特定实现的参数实例化),在该类中进行选择 Smth是这样的: class ExistingQuat1(...): ... class ExistingQuat2(...): ... clas
class ExistingQuat1(...):
...
class ExistingQuat2(...):
...
class MyQuat( self, ..., implementation : str = None )
...
_low_level_q : Union[ ExistingQuat1, ExistingQuat2 ]
def __init__():
if implementation == 'ExistingQuat1':
self._low_level_q = ExistingQuat1(...)
if implementation == 'ExistingQuat2':
self._low_level_q = ExistingQuat2(...)
def __add__( self, other ):
return self.low_level_q + other.low_level_q
# Somewhere else in my code:
q1 = MyQuat()
q2 = MyQuat()
q3 = q1 + q2 # Uses the appropriate method
我还可以想象一种稍微花哨但潜在风险更大的方法:
class MyQuat( self, ..., implementation_class : Union[ ExistingQuat1, ExistingQuat2 ] )
...
_low_level_q : Union[ ExistingQuat1, ExistingQuat2 ]
def __init__():
self. = implementation_class(...)
def __add__( self, other ):
return self.low_level_q + other.low_level_q
实现我想要的东西的正确方法是什么?AFAIU,也有同样的目的。引用中的代码段:
class GreekLocalizer:
"""A simple localizer a la gettext"""
def __init__(self) -> None:
self.translations = {"dog": "σκύλος", "cat": "γάτα"}
def localize(self, msg: str) -> str:
"""We'll punt if we don't have a translation"""
return self.translations.get(msg, msg)
class EnglishLocalizer:
"""Simply echoes the message"""
def localize(self, msg: str) -> str:
return msg
def get_localizer(language: str = "English") -> object:
"""Factory"""
localizers = {
"English": EnglishLocalizer,
"Greek": GreekLocalizer,
}
return localizers[language]()
参考文献:
AFAIU,也有同样的目的。引用中的代码段:
class GreekLocalizer:
"""A simple localizer a la gettext"""
def __init__(self) -> None:
self.translations = {"dog": "σκύλος", "cat": "γάτα"}
def localize(self, msg: str) -> str:
"""We'll punt if we don't have a translation"""
return self.translations.get(msg, msg)
class EnglishLocalizer:
"""Simply echoes the message"""
def localize(self, msg: str) -> str:
return msg
def get_localizer(language: str = "English") -> object:
"""Factory"""
localizers = {
"English": EnglishLocalizer,
"Greek": GreekLocalizer,
}
return localizers[language]()
参考文献: