我的代码库是用Python编写的。假设我有一个相当通用的类,叫做report。它需要大量的参数

class Report(object):

def __init__(self, title, data_source, columns, format, ...many more...)

报告有很多实例。这些实例并非完全无关。许多报表共享相同的参数集,只因细微的变化而有所不同,例如具有相同的数据源和列,但标题不同。

为了使表达式这种结构更容易,应用了一些编程构造,而不是重复参数。我正试图找到一些帮助来整理我的头脑,为这个找出一些习语或设计模式。

如果报表的子类别需要一些额外的处理代码,那么子类似乎是一个不错的选择。假设我们有支出报告的子类别。

class ExpenseReport(Report):

def __init__(self, title, ... a small number of parameters ...)

# some parameters are fixed, while others are specific to this instance

super(ExpenseReport,self).__init__(

title,

EXPENSE_DATA_SOURCE,

EXPENSE_COLUMNS,

EXPENSE_FORMAT,

... a small number of parameters...)

def processing(self):

... extra processing specific to ExpenseReport ...

但在许多情况下,子类别只会修复一些参数,而不需要任何额外的处理。它可以很容易地用偏函数来完成。

ExpenseReport = functools.partial(Report,

data_source = EXPENSE_DATA_SOURCE,

columns = EXPENSE_COLUMNS,

format = EXPENSE_FORMAT,

)

在某些情况下,甚至没有什么区别。我们只需要在不同的环境中使用同一对象的两个副本,比如嵌入到不同的页面中。

expense_report = Report("Total Expense", EXPENSE_DATA_SOURCE, ...)

page1.add(expense_report)

...

page2.add(clone(expense_report))

在我的代码库中,使用了一种丑陋的技术。因为每个页面需要两个单独的实例,而且我们不想用创建报表的长参数列表复制代码,所以我们只克隆(python中的deepcopy)第2页的报表。克隆的需求不仅不明显,忽略了克隆对象,而是共享一个实例,这在我们的系统中造成了许多隐藏的问题和微妙的错误。

在这种情况下有什么指导吗?子类、部分函数或其他习语?我的愿望是让这座建筑变得明亮和透明。我有点担心子类化,因为它可能导致子类的丛林。它诱导程序员添加特殊的处理代码,就像我在ExpenseSreport中所做的那样。如果有需要,我宁愿分析代码,看看它是否可以被通用化并推送到报告层。这样,在不需要在较低层进行特殊处理的情况下,报表就变得更具表现力。

附加信息

我们确实使用关键字参数。问题更多的是如何管理和组织实例化。我们有大量使用通用模式的实例化:

expense_report = Report("Expense", data_source=EXPENSE, ..other common pattern..)

expense_report_usd = Report("USD Expense", data_source=EXPENSE, format=USD, ..other common pattern..)

expense_report_euro = Report("Euro Expense", data_source=EXPENSE, format=EURO, ..other common pattern..)

...

lot more reports

...

page1.add(expense_report_usd)

page2.add(expense_report_usd)   # oops, page1 and page2 shared the same instance?!

...

lots of pages

...

关于克隆和它的问题。也许您可以使用关键字参数的副本?report_args = dict(title='Some tile', data_source=..., columns=..., format=...),然后是expense_report1 = Report(**report_args), expense_report2 = Report(**report_args)。

对我来说还不清楚,你使用什么类型的参数,但是如果你有一个方法需要大量的参数,我认为现在应该使用关键字参数。有问题的一些好例子

为什么不使用关键字参数并将它们全部收集到一个dict中呢?

class Report(object):

def __init__(self, **params):

self.params = params

...

我们确实使用关键字参数。我添加了一些"附加信息"。

这个问题已经很古老了,但这可能仍然有助于那些偶然发现它的人……

我创建了一个名为Classic的小库,以简化类继承案例(仅限Python3)。

简单例子:

from classical.descriptors import ArgumentedSubclass

class CustomReport(Report):

Expense = ArgumentedSubclass(data_source=EXPENSE, **OTHER_EXPENSE_KWARGS)

Usd = ArgumentedSubclass(format=USD)

Euro = ArgumentedSubclass(format=EURO)

PatternN = ArgumentedSubclass(**PATTERN_N_KWARGS)

PatternM = ArgumentedSubclass(**PATTERN_M_KWARGS)

# Now you can chain these in any combination (and with additional arguments):

my_report_1 = CustomReport.Expense.Usd(**kwargs)

my_report_2 = CustomReport.Expense.Euro(**kwargs)

my_report_3 = CustomReport.Expense.PatternM.PatternN(**kwargs)

在这个例子中,并不需要将Report和CustomReport类分开,但最好保持原始类"干净"。

希望这有帮助:)

我自己发现了一些信息。

i.curry——将参数与函数关联?Python食谱?活动房地产代码

http://code.activestate.com/recipes/52549-curry-associating-parameters-with-a-函数/

看看整个讨论。尼克·帕金斯对"轻量级"子类的评论与我所描述的类似。

二。PEP 309——部分函数应用

http://www.python.org/dev/peps/pep-0309/

如果您的主要问题是类构造函数中的常见参数,则可能的解决方案是编写如下内容:

common_arguments = dict(arg=value, another_arg=anoter_value, ...)

expense_report = Report("Expense", data_source=EXPENSE, **common_arguments)

args_for_shared_usd_instance = dict(title="USD Expense", data_source=EXPENSE, format=USD)

args_for_shared_usd_instance.update(common_arguments)

expense_report_usd = Report(**args_for_shared_usd_instance)

page1.add(Report(**args_for_shared_usd_instance))

page2.add(Report(**args_for_shared_usd_instance))

更好的命名,可以使它方便。也许有更好的设计方案。

我看不出为什么你不能只用一个偏函数。

python什么时候用类设计_关于python:类模板的习惯用法或设计模式?相关推荐

  1. python try else多余的设计_在python中利用try..except来代替if..else的用法

    在有些情况下,利用try-except来捕捉异常可以起到代替if-else的作用. 比如在判断一个链表是否存在环的leetcode题目中,初始代码是这样的 # Definition for singl ...

  2. python程序设计课程设计_《Python程序设计》教学大纲.doc

    PAGE 理论课程教学大纲 <Python程序设计>教学大纲 课程编号: 总 学 时:64(其中,讲课:32:实验:32) 学 分:3 实践教学:0周 修读专业:地理信息系统.应用化学 大 ...

  3. 理解python的类实例化_理解python的类实例化

    让我们以一个Foo类开始: class Foo(object): def __init__(self, x, y=0): self.x = x self.y = y 当你实例化它(即创建该类的一个新的 ...

  4. python版植物大战僵尸源码_基于python的植物大战僵尸游戏设计与实现.docx

    湖南理工学院毕业设计(论文) PAGE PAGE 1 学 号 毕业设计(论文) 题目:基于python的植物大战僵尸游戏设计与实现 作 者 届 别 届 院 别 信息与通信工程学院 专 业 信息工程 指 ...

  5. python游戏设计_【Python】设计一款养成类游戏

    上一节: 想起自己初中时,上学时拿着诺基亚手机,敲着9宫格键盘,一个月50M的流量,只能玩玩文字游戏,却玩得不亦乐乎.为了唤起你的记忆,一起走进今天的代码吧! 编程有这样一个说法之分,面向过程和面向对 ...

  6. python上位机界面设计_用Python写界面--上位机开发

    Python真的可以说是无所不能,上到人工智能.图像识别.下到控制电机.爬虫.数据处理,前不久发现Python还可以做界面,虽然比较丑,但是还是可以一试. Python内置图形界面库--Tkinter ...

  7. java教务系统类设计_基于Java EE体系的高校教务管理系统的设计开发

    <基于Java EE体系的高校教务管理系统的设计开发>由会员分享,可在线阅读,更多相关<基于Java EE体系的高校教务管理系统的设计开发(3页珍藏版)>请在人人文库网上搜索. ...

  8. 基于python的气象数据分析统计服_基于Python的风向风速数据分析的设计与实现

    基于 Python 的风向风速数据分析的设计与实现 李文倩 ; 刘婕 [期刊名称] < <信息通信> > [年 ( 卷 ), 期] 2019(000)009 [摘要] Pyth ...

  9. 马哥python数据分析课程设计_搭建python数据分析平台

    基本结构 其实没什么高深的东西,无非是常用的那一套: pandas, numpy, matplotlib- 但是为了更方便使用,加持了 jupyter notebook(即以前的ipython not ...

最新文章

  1. Task01:青少年软件编程(Scratch)等级考试模拟卷(一级)
  2. css3 3d变换和动画——回顾
  3. BS-XX-007基于JSP实现户籍管理系统
  4. BIT的浅谈,简单理解
  5. Serverless 领域近一年行业发展回顾
  6. image vb6 图片自适应_请问如何实现图片在窗体上的大小自适应?
  7. isfull mysql_MySQL数据库之MySQL 出现 The table is full 的解决方法
  8. linux文件句柄满了 现象_Linux 离奇磁盘爆满,如何解决? | 原力计划
  9. sublime text 2 解决错误 [Decode error - output not utf-8]
  10. ld framework not found FileProvider for architecture x86_64 报错
  11. 小芭比linux怎么装win7_小户型再怎么装也是小?看完我闭嘴了
  12. 计算机组装报告目录,计算机组装实验报告(共9篇).doc
  13. id nfc模拟_模拟门禁卡: NFC卡模拟 v3.1.5 清爽版
  14. OPPO手机怎样把图片拼在一起(拼图教程分享)
  15. 如何设置通知区域图标不显示?
  16. css 比较好看的字体
  17. 终于明白了异地恋为什么那么难
  18. htonl htons ntohl ntohs inet_pton inet_ntop
  19. 响应式织梦模板家具家居类网站
  20. 另类解决android中用三星手机拍的照片存储后旋转问题。

热门文章

  1. 为什么说即便是新手,也应该学习微服务?
  2. Erlang 二十年,如何在编程语言中占据一席之地?
  3. 微软推出新逆天开源语言,告别 for 循环,提高开发效率!
  4. 漫画:如何求图的最短路径? | 技术头条
  5. 超过 C++、压制 Java 与 C,Python 拔得 TIOBE 年度编程语言!
  6. 为什么 ofo 彻底凉了?| 畅言
  7. 单身税的时代就要来临,你还没有用Python帮你找一个女朋友吗?
  8. 拒绝“佛系”程序员!
  9. Java高级面试题!这是一份面向Java开发者的复习指南
  10. nginx并发性能测试