python什么时候用类设计_关于python:类模板的习惯用法或设计模式?
我的代码库是用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:类模板的习惯用法或设计模式?相关推荐
- python try else多余的设计_在python中利用try..except来代替if..else的用法
在有些情况下,利用try-except来捕捉异常可以起到代替if-else的作用. 比如在判断一个链表是否存在环的leetcode题目中,初始代码是这样的 # Definition for singl ...
- python程序设计课程设计_《Python程序设计》教学大纲.doc
PAGE 理论课程教学大纲 <Python程序设计>教学大纲 课程编号: 总 学 时:64(其中,讲课:32:实验:32) 学 分:3 实践教学:0周 修读专业:地理信息系统.应用化学 大 ...
- 理解python的类实例化_理解python的类实例化
让我们以一个Foo类开始: class Foo(object): def __init__(self, x, y=0): self.x = x self.y = y 当你实例化它(即创建该类的一个新的 ...
- python版植物大战僵尸源码_基于python的植物大战僵尸游戏设计与实现.docx
湖南理工学院毕业设计(论文) PAGE PAGE 1 学 号 毕业设计(论文) 题目:基于python的植物大战僵尸游戏设计与实现 作 者 届 别 届 院 别 信息与通信工程学院 专 业 信息工程 指 ...
- python游戏设计_【Python】设计一款养成类游戏
上一节: 想起自己初中时,上学时拿着诺基亚手机,敲着9宫格键盘,一个月50M的流量,只能玩玩文字游戏,却玩得不亦乐乎.为了唤起你的记忆,一起走进今天的代码吧! 编程有这样一个说法之分,面向过程和面向对 ...
- python上位机界面设计_用Python写界面--上位机开发
Python真的可以说是无所不能,上到人工智能.图像识别.下到控制电机.爬虫.数据处理,前不久发现Python还可以做界面,虽然比较丑,但是还是可以一试. Python内置图形界面库--Tkinter ...
- java教务系统类设计_基于Java EE体系的高校教务管理系统的设计开发
<基于Java EE体系的高校教务管理系统的设计开发>由会员分享,可在线阅读,更多相关<基于Java EE体系的高校教务管理系统的设计开发(3页珍藏版)>请在人人文库网上搜索. ...
- 基于python的气象数据分析统计服_基于Python的风向风速数据分析的设计与实现
基于 Python 的风向风速数据分析的设计与实现 李文倩 ; 刘婕 [期刊名称] < <信息通信> > [年 ( 卷 ), 期] 2019(000)009 [摘要] Pyth ...
- 马哥python数据分析课程设计_搭建python数据分析平台
基本结构 其实没什么高深的东西,无非是常用的那一套: pandas, numpy, matplotlib- 但是为了更方便使用,加持了 jupyter notebook(即以前的ipython not ...
最新文章
- Task01:青少年软件编程(Scratch)等级考试模拟卷(一级)
- css3 3d变换和动画——回顾
- BS-XX-007基于JSP实现户籍管理系统
- BIT的浅谈,简单理解
- Serverless 领域近一年行业发展回顾
- image vb6 图片自适应_请问如何实现图片在窗体上的大小自适应?
- isfull mysql_MySQL数据库之MySQL 出现 The table is full 的解决方法
- linux文件句柄满了 现象_Linux 离奇磁盘爆满,如何解决? | 原力计划
- sublime text 2 解决错误 [Decode error - output not utf-8]
- ld framework not found FileProvider for architecture x86_64 报错
- 小芭比linux怎么装win7_小户型再怎么装也是小?看完我闭嘴了
- 计算机组装报告目录,计算机组装实验报告(共9篇).doc
- id nfc模拟_模拟门禁卡: NFC卡模拟 v3.1.5 清爽版
- OPPO手机怎样把图片拼在一起(拼图教程分享)
- 如何设置通知区域图标不显示?
- css 比较好看的字体
- 终于明白了异地恋为什么那么难
- htonl htons ntohl ntohs inet_pton inet_ntop
- 响应式织梦模板家具家居类网站
- 另类解决android中用三星手机拍的照片存储后旋转问题。