返回变量与分配属性

时间:2016-01-29 13:53:00

标签: python class object attributes

我从来没有接受过正式的OOP教学,只是偶然发现了我在python中的基础知识,但我正处于十字路口。 处理实例化的类对象时,最好通过方法分配属性,还是让方法只返回值?我已经阅读了很多关于不让对象的状态摆脱困境,但无法弄清楚最好的方法。这是一个简单的例子:

import magic
class Histogram():
    def __init__(self,directory):
        self.directory = directory

    # Data Option 1
    def read_data(self):
         data = []
         file_ref = open(self.directory,'r')
         line = file_ref.readline()
         while line:
             data.append(line)
             line = file_ref.readline()
         return data

    # Data Option 2
    def set_data(self):
         data = []
         file_ref = open(self.directory,'r')
         line = file_ref.readline()
         while line:
             data.append(line)
             line = file_ref.readline()
         self.data = data



    # Hist Option 1
    def build_histogram(self):
        data = self.read_data()

        # It's not important what magic.histogram does.
        self.histogram = magic.histogram(data)

    # Hist Option 2
    def get_histogram(self,data):
        return magic.histogram(data)

    # Hist Option 3 - this requires self.get_data() to have already run.
    def build_histogram_2(self):
        self.histogram = magic.histogram(self.data)

因此,数据选项1强制用户调用它并将其存储在某处以与Hist Option 2结合使用,或将其存储在self.data中以与Hist Option 3一起使用。 数据选项2允许您使用历史选项3,但您仍然必须已经运行set_data。

所以我真正的问题是,对于一个有不同方法的课程,通常可以但不必链接在一起,我该怎么写呢?隐含地设置属性和风险让状态搞砸了?返回变量并让“用户”设置它们?拥有我的方法使用的属性的getter,如果属性不存在,那么以某种方式处理它?<​​/ p>

如果您需要更好的解释或其他示例或其他任何内容,请与我们联系。

2 个答案:

答案 0 :(得分:2)

询问对象代表什么。该数据是否合理地属于对象本身?

在这种情况下,我会说是的。您的数据选项2正在加载合理地属于&#34;属于的数据。直方图对象 - 尽管认为构造函数应该只加载它而不需要单独的方法调用来实现它是合理的。

另外,如果你走另一条路,这不是一个真正的对象;你只是简单地使用对象框架来收集一些相关的子程序。

答案 1 :(得分:1)

我认为如果许多方法可能会使用该值,那么最好在实例化(init)上设置它。如果你每次要使用它都需要计算,那么你不需要它作为一个属性(只是一个变量),它应该在你打算使用时计算。

最后我要做的是避免我的对象像状态机一样,你不知道在某些时候你可以或不能调用什么方法,因为你不知道你有什么价值已经计算好了。