首页 > 解决方案 > When given the choice of a method, should the user set it when instantiating or later on?

问题描述

我会跳到这个例子,因为我认为它会变得更清楚。我应该更喜欢这样做吗:

class Substance():

    def __init__(subst,name,density_method,**kwargs):
         
        self.name   = name
        self.kwargs = kwargs
        self.density_method = density_method

    def density_method_1(self):
        #Something Here

    def density_method_2(self):
        #Something Else Here

class Air(Substance):
    Subst.__init__(self,name,gas_density_method=gas_density_method_1,**kwargs)

    # More stuff here

Air_1 = Air('Air_1',T=700,P=101325)
Air_2 = Air('Air_2',gas_density_method=gas_density_method_2,T=700,P=101325)

或这个:

class Substance():

    def __init__(subst,name,**kwargs):
         
        self.name   = name
        self.kwargs = kwargs
        self.density_method = density_method_1 #Default is now here

    def density_method_1(self):
        #Something Here

    def density_method_2(self):
        #Something Else Here

class Air(Substance):
    Subst.__init__(self,name,**kwargs)

    # More stuff here

Air_1 = Air('Air_1',T=700,P=101325)
Air_2 = Air('Air_2',T=700,P=101325)
Air_2.density_method = density_method_2

这是一个基本示例,但我有超过 10 种方法(密度、粘度等),每种方法都可以有 1 种或多种不同的可能性。这里的答案是否纯粹基于设计,是否有任何好的“实践”,并且其中一个在性能方面更好(在我的情况下很重要)?另外,如果 density_method_2 比 method_1 有额外的参数会发生什么?(由于用户主动请求method_2,他们有责任知道有额外的参数,所以我目前正在让它们通过**kwargs 以便稍后在相关方法中收集)提前感谢,祝你有美好的一天!

标签: pythonoop

解决方案


注入依赖项总是最好的。在这种情况下,您的第一个选择更好。它使您的代码更易于测试且更易于模拟。尝试为这两种情况编写测试,你就会明白为什么。阅读更多关于 Python 的依赖注入和鸭子类型的信息。


推荐阅读