python - 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 以便稍后在相关方法中收集)提前感谢,祝你有美好的一天!
解决方案
注入依赖项总是最好的。在这种情况下,您的第一个选择更好。它使您的代码更易于测试且更易于模拟。尝试为这两种情况编写测试,你就会明白为什么。阅读更多关于 Python 的依赖注入和鸭子类型的信息。
推荐阅读
- javascript - 构造函数中的箭头函数和 this
- r - 合并未按预期工作:内部联接未返回第 1 列中的所有匹配行
- react-native - 地图缩放级别基于半径 React Native 地图
- angular - Angular Ionic 3 表单构建器自定义验证器不适用于电子邮件类型,但适用于文本类型
- javascript - 为什么我在 Django 应用程序中的 jquery 不起作用?
- javascript - reactjs正则表达式#xxx#
- javascript - 全局定义在 vue.js 中不起作用
- c# - 通用列表中的数组
- java - PrintWriter 对象变量在尝试使用资源时无法解析为类型
- javascript - 我有一个具有重复值的对象,我需要获取重复值并将它们插入到父对象中