Python 在类的各种底层实现之间进行选择

Python 在类的各种底层实现之间进行选择,python,python-3.x,Python,Python 3.x,假设已经存在一些不同的抽象python实现。对于确定性,假设我们有各种表示四元数的类,它们具有大致相同的标准功能(方法、变量) 在我的项目中,我希望用户能够选择这个抽象的特定底层实现。同时,我希望我的大部分代码都以独立于特定底层实现的方式实现 我想,一种解决方案是创建我自己的类(通过选择特定实现的参数实例化),在该类中进行选择 Smth是这样的: class ExistingQuat1(...): ... class ExistingQuat2(...): ... clas

假设已经存在一些不同的抽象python实现。对于确定性,假设我们有各种表示四元数的类,它们具有大致相同的标准功能(方法、变量)

在我的项目中,我希望用户能够选择这个抽象的特定底层实现。同时,我希望我的大部分代码都以独立于特定底层实现的方式实现

我想,一种解决方案是创建我自己的类(通过选择特定实现的参数实例化),在该类中进行选择

Smth是这样的:

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]()
参考文献: