首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将数据作为对象属性导入和使用的Pythonic方法

将数据作为对象属性导入和使用的Pythonic方法
EN

Stack Overflow用户
提问于 2017-01-12 19:13:38
回答 1查看 80关注 0票数 0

我正在处理导入后用作变量的数据。然后,我想使用对象中的变量作为属性。

到目前为止,我已经通过编写一个ImportData类实现了这一点,然后它被组合到另一个类Obj中,该类用于其他计算。我使用的另一个解决方案是从ImportData类继承。下面是我的一个例子:

定义数据类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ImportData:
    def __init__(self, path):
        # open file and assign to some variables
        # such as:
        self.slope = 1
        self.intercept = -1

解决方案1:使用组合

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Obj:
    def __init__(self, data_object):
        self.data = data_object

    def func(self, x):
        return self.data.slope*x + self.data.intercept


data_object = ImportData('<path>')
obj = Obj(data_object)

# get the slope and intercept
print('slope =', obj.data.slope, '  intercept =', obj.data.intercept)

# use the function
print('f(2) =', obj.func(2))

解决方案2:使用继承

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Obj(ImportData):
    def __init__(self,path):
        super().__init__(path)

    def func(self, x):
        return self.slope*x + self.intercept

obj = Object('<path>')
# get the slope and intercept
print('slope =', obj.slope, '  intercept =', obj.intercept)

# use the function
print('f(2) =', obj.func(2))

我不喜欢这种组合解决方案,因为每次需要访问属性时,我都必须输入额外的"data“,但我也不确定继承是不是正确的方法。

我是不是在左外野,有更好的解决方案?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-13 07:22:46

您认为组合解决方案中的链式属性访问是一种代码气味的感觉是正确的:dataObj的实现细节,应该对Obj的客户端隐藏,因此如果ImportData类的实现发生更改,您只需更改Obj,而不是每个调用obj.data的类。

我们可以通过给Obj一个__getattr__方法来隐藏Obj.data,以控制如何访问它的属性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> class ImportData:
...     def __init__(self, path):
...         self.slope = 1
...         self.intercept = -1
... 
>>> data = ImportData()


>>> class Obj:
...     def __init__(self, data_object):
...         self.data = data_object

...     def func(self, x):
...         return self.slope*x + self.intercept

...     def __getattr__(self, name):
...         try:
...             return getattr(self.data, name)
...         except AttributeError:
...             raise AttributeError('{} object has no attribute {}.'.format(self.__class__.__name__, name))

>>> o = Obj(data)
>>> o.func(2)
1
>>> o.slope
1
>>> o.intercept
-1
>>> 

通常,如果python找不到对象的属性--例如obj.slope --它将引发一个AttributeError。但是,如果对象有一个__getattr__方法,python将调用__getattr__,而不是引发异常。

在上面的代码中,如果data上不存在该属性,则Obj.__getattr__将在Obj上查找该属性,因此Obj的客户端可以调用obj.slope而不是obj.data.slope

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41621117

复制
相关文章
ajax中window.location.href不跳转
$.ajax({ url: '/Ajax/System/ajaxcheshi.ashx', dataType:'text', // datatype: 'json', type: 'post', data:user,//,quenceAge=quenceAge,ctertime=ctertime,tquencether=tquencether,Status=Status} success: function (data) { if (data == '1') { ; // window.location.href = 'ModelDatasequence.aspx'; // location.href = 'ModelDatasequence.aspx'; // window.location.href='http://www.hao123.com'; // $this.redirect('Management/ModelDatasequence.aspx'); setTimeout('; } else { ; } }) 解决方案 把你的 type='submit' 换成type='button' //原因: 因为有提交了一次表单。你的ajax是同步的,所以提交表单动作被挂起直到ajax完毕后(此时执行请求过一次服务器),表单会提交,这样就会执行页面指定的action的地址, 而ajax回调success href的链接赋值不成功(这个问题有兴趣的去研究) 参考http://www.cnblogs.com/horsen/p/6933038.html 注意起来一个情况:ajax+submit+同步----就是你用ajax请求服务器,而且用的是同步的方式,并且你是通过点击了type类型为submit的按钮来触发这个ajax。 这个时候,首先你点击了submit,它会提交表单,但是由于你用了ajax的同步操作,submit的提交被阻塞,ajax先执行,这个时候,如果你在ajax的回调函数(如:success)中写了document.location.href='xxx.html',它是执行了,的确是去执行了跳转的,于是ajax完成了,那接下来就要把刚才的submit提交的请求完成。于是呢又要从xxx.html跳回到刚才那个页面(无论你submit有没有提交具体的数据,总之提交了之后如果后台没有执行跳转/重定向,它就要回到原来的页面。)
似水的流年
2019/12/13
2.2K0
TypeScript-可选属性和索引签名
本章节要介绍的内容为 TS 接口当中的可选属性和索引签名,如果要想先了解可选属性和索引签名之前首先要来介绍一下接口的注意点,接口的注意点就是如果你使用了接口类型来限定了函数的入参,限定了某个变量,这个时候你调用函数或者使用变量的时候就必须和接口里面的限定一模一样,例如之前我们接口当中有 firstName 与 lastName 那么你调用函数给入参的时候入参的参数当中就必须包含该两个参数,那么如何来验证一下我所说的这一点内容呢,其实很简单,直接上代码即可如下代码是正常情况下的代码:
杨不易呀
2023/09/28
3190
TypeScript-可选属性和索引签名
6.5k stars是Ping,但带有图表
什么是ping ping命令通过ICMP(Internet控制消息协议)工作;ping可以用来测试本机与目标主机是否联通、联通速度如何、稳定性如何。 什么是gping gping是一个 Linux 工具,它提供与 ping 相同的功能,并在图表上显示信息。gping可以收集主机随时间的响应时间。用 gping可以同时 ping 多个主机,从而可以轻松比较响应时间。你可以自定义gping 输出图的展示信息。效果如下。 GitHub数据 6.5k stars 75 watching 236 forks 开源
开源日记
2023/03/10
3620
6.5k stars是Ping,但带有图表
layui数据表格checkbox设置部分不可选
在layui数据表格中设置了字段为type:checkbox 但是想要实现部分不显示,不可选的功能。
宣言言言
2019/12/17
14K0
jQuery 重点解析 write less,but do more
向页面添加 jQuery 库 <head> <script type="text/javascript" src="jquery.js"></script> </head> jQuery 选择器 选择器 实例 选取 * $("*") 所有元素 #id $("#lastname") id="lastname" 的元素 .class $(".intro") 所有 class="intro" 的元素 element
小白哥哥
2022/05/11
1.3K0
将数据迁移到云:回到未来?
数百家公司现在已经证明,单一数据泄露可能会造成长期的经济,法律和品牌上的损失。除了数据保护之外,仅仅管理云中的数据是不同的,如果做法不当,成本,复杂性和风险会使一切毁于一旦。
静一
2018/07/31
1.4K0
将数据迁移到云:回到未来?
jQuery
当Jquery名称冲突时,可以利用var jq = jQuery.noConflict()来使用jq代替表示Jquery。
matt
2022/10/25
16.4K0
typescript 属性修改器 可选 只读 索引签名
可选属性 interface MyType { name: string opts?: string } function func(opts:MyType){} func({name
路过君
2022/04/13
6960
jQuery ajax() 方法
jQuery 库拥有完整的 Ajax 兼容套件,其中的函数和方法允许我们在不刷新浏览器的情况下从服务器加载数据。
阳光岛主
2019/02/19
2.5K0
jQuery ajax() 方法
SPA网站SEO优化PhantomJs
随着web2.0的兴起,ajax的时代已经成为了事实,更如今Knockout,backbone, angular,ember前端MDV(model driver view)框架强势而来,Single Page Application已经为大家所熟悉了。如今常见的SPA程序,restfull和前端MDV之类的框架能够实实在在的减少我们的代码开发量,让我更多的注意力关注在真正的业务逻辑上。在众多前端MDV框架从博客中可以看出来笔者还是钟爱于angular,然而服务端平台的选择的话:在.net平台笔者会首选webapi+oData,jvm平台spring restfull。
javascript.shop
2019/09/04
2K0
SPA网站SEO优化PhantomJs
关于js中window.location.href,location.href,parent.location.href,top.location.href的用法
"window.location.href"、"location.href"是本页面跳转.
botkenni
2022/03/24
2.1K0
第25期:索引设计(索引的基数与可选择性)
这篇主要介绍 MySQL 索引的 Cardinality 值(基数)以及索引的可选择性。
爱可生开源社区
2021/04/23
6670
mssql 优化之索引部分
具有较高的 index_advantage 的索引那些 SQL 服务器认为会产生最大的积极影响,减少工作量,基于查询的成本和预期他们会使用索引的次数减少。
旺财的城堡
2018/11/20
1.2K0
MongoDB 部分索引(Partial Indexes)
a、部分索引就是带有过滤条件的索引,即索引只存在与某些文档之上 b、满足过滤条件的文档在查询时,其执行计划将使用该列上的索引,否则不会被使用 c、稀疏索引与部分索引的差异是一个是基于某些文档存在的列,一个是列上的某些匹配条件的值 d、可以基于某个列上创建索引,而在另外的列来使用过滤条件
Leshami
2018/08/08
1.7K0
Java 判断是否是 Ajax 异步请求
Java 判断是否是 Ajax 异步请求 /** * 是否是Ajax异步请求 */ public static boolean isAjaxRequest(HttpServletRequest request) { String accept = request.getHeader("accept"); if (accept != null && accept.indexOf("application/json") != -1)
一个会写诗的程序员
2019/12/02
2K0
JQuery基础
学习jQuery的时候,很快过了一遍,发现好多知识点不清晰。看来还是要写出来加深印象,平时多练习! jQuery是一个Javascript函数库,轻量级,“写得少,做的多!”,它有以下功能: HTML元素选取 HTML元素操作 CSS操作 HTML事件函数 JavaScript特效和动画 HTML DOM遍历和修改 AJAX Utilities(实用工具) 很多大公司都在使用jQuery:Google,Microsoft,IBM等。jQuery兼容所有主流浏览器,包括IE6(不失为解决兼容性的一种方法)。
用户1149564
2018/01/11
4.7K0
JQuery基础
实现带有验证码的ajax局部刷新登录界面
     现在的登录界面大多数都带有:验证码的功能+验证码局部刷新+ajax登录。用ajax登录的好处最明显就是速度快,URL地址没有变化。所有现在登录功能很少再用form表单post提交了,大多数都已经采用了ajax局部访问后台然后解析返回值并显示结果到界面上面。理论还是要拿来实践才能验证的,下面直接上代码。
林老师带你学编程
2022/11/30
3.5K0
实现带有验证码的ajax局部刷新登录界面
jQuery 教程
菜鸟教程 — jQuery 教程:https://www.runoob.com/jquery/jquery-tutorial.html
全栈程序员站长
2022/09/03
17K0
jQuery 教程
仅对部分数据构建索引
索引会占用比想象中的还要大的空间,有好几次我向表中添加索引以增加速度,但是对磁盘使用量的快速增长感到震惊。虽然索引是构建在列上,但是并不是每个行记录都需要在索引里面,这是部分索引partial indexes就提供了一个解决方案。
yzsDBA
2021/01/18
3220
TS 类型编程:索引类型递归去掉可选修饰
这很正常,因为可选索引的含义就是值和 undefined 的联合类型 value | undefined。
神说要有光zxg
2022/11/11
6300
TS 类型编程:索引类型递归去掉可选修饰

相似问题

RedirectToAction返回到调用操作

10

带可选参数的RedirectToAction?

10

带有可选部分的DateTimeFormater

14

RedirectToAction -如何回到前两页?

22

如何返回到调用RedirectToAction(..)的操作?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文