带有抽象类的面向对象的编程

发布于 2025-02-07 06:30:09 字数 1066 浏览 4 评论 0原文

我想实现以下内容:

def do_something(request):
    company_name = request.get("company_name", DEFAULT_COMPANY)
    data = request.get("data")
    response = transform_data_according_to(data, company_name)
    return response

我为此做了以下操作:

class Transform(ABC):
    def __init__(self, data):
        self.data = data

    @abstractmethod
    def transform(self):
        pass

class CompanyA(Transform):
    def transform(self):
        # do_transformation
        return transformed_data

def do_something(request):
    company_name = request.get("company_name", DEFAULT_COMPANY)
    data = request.get("data")
    if company_name == CompanyA:
        response = CompanyA.transform(data)
    return response

相反,我想使用正确的对象的原则来做类似的事情:

def do_something(request):
    company_name = request.get("company_name", DEFAULT_COMPANY)
    data = request.get("data")
    response = Transform(data, company_name)
    return response

我想知道我可能会在所需的方法和实现方法方面想在哪里思考。实施方法是否正确,在这种情况下,如果其他检查可以增长很大。

I want to achieve the below:

def do_something(request):
    company_name = request.get("company_name", DEFAULT_COMPANY)
    data = request.get("data")
    response = transform_data_according_to(data, company_name)
    return response

I did the following for it:

class Transform(ABC):
    def __init__(self, data):
        self.data = data

    @abstractmethod
    def transform(self):
        pass

class CompanyA(Transform):
    def transform(self):
        # do_transformation
        return transformed_data

def do_something(request):
    company_name = request.get("company_name", DEFAULT_COMPANY)
    data = request.get("data")
    if company_name == CompanyA:
        response = CompanyA.transform(data)
    return response

Instead i would like to do something like this using correct object oriented principles:

def do_something(request):
    company_name = request.get("company_name", DEFAULT_COMPANY)
    data = request.get("data")
    response = Transform(data, company_name)
    return response

I want to know where I might be thinking wrong in terms of the desired approach versus the implemented approach. Is the implemented approach correct, the if else checks can grow quite big in that case.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

汹涌人海 2025-02-14 06:30:09

感谢 teraflop

简单,惯用的方法可以在Python中进行此操作。词典中的变换子类:

transform_classes = {
    "CompanyA": CompanyA,
    # ...
}

def do_something(request):
    company_name = request.get("company_name", DEFAULT_COMPANY)
    data = request.get("data")
    transformer = transform_classes[company_name](data)
    return transformer.transform()

如果您希望更严格地面向对象,则可以将字典包裹在对象(例如transform lookupbyname)中,而不是直接访问它。

您还可以自动使用各种元编程魔术来自动构建字典,而无需明确命名每个子类。例如,这将收集当前源文件中的所有transform子类:

transform_classes = {
    k:v for k,v in globals().items() 
        if isinstance(v, type) and issubclass(v, Transform) and v != Transform
}

Thanks to teraflop

The simple, idiomatic way to do this in Python would be to look up the Transform subclass in a dictionary:

transform_classes = {
    "CompanyA": CompanyA,
    # ...
}

def do_something(request):
    company_name = request.get("company_name", DEFAULT_COMPANY)
    data = request.get("data")
    transformer = transform_classes[company_name](data)
    return transformer.transform()

If you prefer to be more rigorously object-oriented, you could wrap the dictionary in an object (e.g. TransformLookupByName) instead of accessing it directly.

There are also various kinds of metaprogramming magic you can use to build the dictionary automatically without having to name each subclass explicitly. For example, this will collect all of the Transform subclasses in the current source file:

transform_classes = {
    k:v for k,v in globals().items() 
        if isinstance(v, type) and issubclass(v, Transform) and v != Transform
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文