Python中文
首页
教程
问答
标签
搜索
登录
注册
在Python中优先选择字典而不是对象
回答此问题可获得
20
贡献值,回答如果被采纳可获得
50
分。
<p>在Python中使用字典而不是对象(反之亦然)是否有好处?在</p> <p>我正在工作的项目目前有很多地方使用字典,而我通常会在这些地方创建对象。在我看来,对象提供了更多的结构,允许像pylint这样的程序进行更好的程序员错误检查,但是很难解释为什么<em>我会使用对象而不是dict</p> <p>对于模拟示例,一个模块创建小部件并包含如下方法:</p> <pre><code>def create(self, propertyA, propertyB=55, propertyC="default", propertyD=None, propertyE=None, propertyF=None, propertyG=None, propertyH=None, propertyI=None): </code></pre> <p>该方法将通过创建字典并按如下方式传入来调用:</p> ^{pr2}$ <p>当我看到这一点时,我发现这些属性中的每一个都描述了一个“Widget”,并希望执行以下操作:</p> <pre><code>class Widget(object): """Represents a widget.""" def __init__(self, propertyA, **kwargs): """Initialize a Widget. :param propertyA: The name of the widget. :param kwargs: Additional properties may be specified (see below). :returns: None """ self.propertyA = propertyA self.propertyB = kwargs.get("propertyB", 55) self.propertyC = kwargs.get("propertyC", "default") self.propertyD = kwargs.get("propertyD", None) self.propertyE = kwargs.get("propertyE", None) self.propertyF = kwargs.get("propertyF", None) </code></pre> <p>然后更新create()方法如下所示:</p> <pre><code>def create(self, widget): </code></pre> <p>结果是这样的:</p> <pre><code>widget_client = WidgetClient() widget = Widget(propertyA="my_widget") widget.propertyB = 10 ... widget_client.create(widget) </code></pre> <p>在我看来,这显然更好,但我过去错了,我想不出该怎么解释自己。当然,我仍然在使用**kwargs,这可以通过将Widget分解成更小的组件/相关部分和创建更多的对象等来避免,但我觉得这是一个很好的“第一步”。这有什么意义吗?在</p> <p><strong>字典的好处</strong>:</p> <ol> <li>更快和/或更高效的内存</li> </ol> <p><strong>字典的缺点</strong>:</p> <ol> <li>无法使用静态代码检查程序捕获某些错误</li> <li>所有窗口小部件属性的完整列表可能永远不会出现或为人所知</li> </ol> <p><strong>对象的好处</strong>:</p> <ol> <li>确切地知道“小部件”是由什么组成的</li> <li>使用静态代码检查程序可能会捕获错误(尽管使用**魔法可以防止某些错误)</li> </ol> <p><strong>缺点:</p> <ol> <li>速度较慢和/或内存效率较低</li> </ol> <p>这似乎是一个愚蠢的问题,但为什么要用字典可以处理的对象呢?在</p>
0 条评论
分类:
Python问答
请先
登录
后评论
默认排序
时间排序
1 个回答
匿名
1天前
擅长:python、mysql、java
<p>使用任何内置的数据类型都会给您带来一些功能上的优势,而且它的行为也为其他程序员所熟知。字典给了你一个充满了内置方法的拳头,没有人会怀疑它是否是iterable。在</p> <p>这只是一个优势。我不是说你应该总是使用字典而不是声明你自己的对象。(当然,您的新对象可以继承类似字典的行为),但您不必总是选择创建一个新对象,而一个更简单的存储机制可能会做到这一点。以理解为指导,这将取决于Widget是否有任何特殊的行为或属性。在</p>
请先
登录
后评论
针对此问题:
更多的回答
关注
89
关注
收藏
1
收藏,
216
浏览
网友 提问于 2天前
相关Python问题
我想从用户inpu创建一个类的实例
5 回答
我想从用户导入值,为此
1 回答
我想从用户那里得到一个整数输入,然后让for循环遍历该数字,然后调用一个函数多次
9 回答
我想从用户那里收到一个列表,并在其中执行一些步骤,然后在步骤完成后将其打印回来,但它没有按照我想要的方式工作
2 回答
我想从用户那里获取输入,并将值传递给(average=dict[x]/6),然后在那里获取resu
8 回答
我想从第一个列表中展示第一个词,然后从第二个列表中展示十个词,以此类推- Python
2 回答
我想从第一个空lin开始解析文本文件
1 回答
我想从简历、简历中提取特定部分
3 回答
我想从给定字典(python)的字符串中删除\u00a9、\u201d和类似的字符。
2 回答
我想从给定的网站Lin下载许多文件扩展名相同的Wget或Python文件
6 回答
我想从网上搜集一些关于抵押贷款的数据
10 回答
我想从网站上删除电子邮件地址
2 回答
我想从网站上读取数据该网站包含可下载的文件,然后我想用python脚本把它发送给oracle如何?
2 回答
我想从网站中提取数据,然后将其显示在我的网页上
6 回答
我想从网页上提取统计数据。
4 回答
我想从网页上解析首都城市,并在用户输入国家时在终端上打印它们
6 回答
我想从色彩图中删除前n个颜色,而不丢失原始颜色数
9 回答
我想从课堂上打印字典里的键
10 回答
我想从费用表中获取学生上次支付的费用,其中学生id=id
2 回答
我想从较低的顺序对多重列表进行排序,但我无法在一行中生成结果
10 回答