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

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

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

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

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

定义数据类

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

解决方案1:使用组合

代码语言:javascript
代码运行次数:0
运行
复制
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
运行
复制
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 15:22:46

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

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

代码语言:javascript
代码运行次数:0
运行
复制
>>> 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

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档