Python - 在类本身中创建共享类变量

时间:2015-02-15 09:11:21

标签: python

我是Python的新手,我一直面临着一个问题,我无法在stackoverflow上找到直接的答案(但我想我只是没有足够的经验来谷歌正确的条款)。我希望你能帮忙

考虑一下:

import numpy as np

class Data:

    def __init__(self, data):
        self.data = data

    def get_dimensions(self):
        return np.shape(self.data)


test = Data(np.random.random((20, 15)))
print(test.get_dimensions())

这给了我

(20, 15)

就像我想要的那样。

现在这就是我想做的事情: 在我的数据处理过程中,我需要经常获取数据集的形状,尤其是在类本身中。但是,我不想每次都打电话给numpy

self.get_dimensions()

因为我认为这总是会通过分析数组的过程。有没有办法只计算一次形状变量,然后在类中共享它,这样可以节省计算时间?

我的问题更复杂,因为我需要首先打开文件,阅读它们并从中获取数据的形状,所以我真的想避免每次想要获得形状时这样做...... / p>

我希望你能看到我的问题 谢谢!!

编辑:

我的问题已经得到解答,但我想问一个跟进问题是否也有效:

import numpy as np

class Data:

    def __init__(self, data):
        self.data = data
        self.dimensions = self._get_dimensions()

    def _get_dimensions(self):
        return np.shape(self.data)


test = Data(np.random.random((20, 15)))
print(test.dimensions)

我问这个问题,因为根据你们所描述的方法,我必须在某个地方至少计算一次,然后才能得到尺寸。这种方式是否也总是通过计算过程,或只存储一次?

再次感谢!

4 个答案:

答案 0 :(得分:2)

您可以将结果缓存为成员变量(如果我正确理解了问题):

import numpy as np

class Data:

    def __init__(self, data):
        self.data = data
        self.result = None

    def get_dimensions(self): 
        if not self.result:
            self.result = np.shape(self.data)
        return self.result


test = Data(np.random.random((20, 15)))
print(test.get_dimensions())

答案 1 :(得分:2)

当然,你可以这样做:

class Data:

    def __init__(self, data):
        self.data = data
        self.dimensions = None

    def get_dimensions(self):
        self.dimensions = (np.shape(self.data) if 
            self.dimensions is None else 
            self.dimensions)
        return self.dimensions

如果您需要修改self.data并重新计算self.dimensions,可以使用关键字参数更好地为您提供服务,以指定是否要重新计算结果。例如:

    def get_dimensions(self, calculate=False):
        self.dimensions = (np.shape(self.data) 
             if calculate or self.dimensions is None
             else self.dimensions)
        return self.dimensions

答案 2 :(得分:2)

数组的形状直接存储在数组中,而不是计算值。阵列的形状必须存储为后备存储器是平面阵列。因此(4, 4)(2, 8)(16,)将具有相同的后备数组。在不存储形状的情况下,阵列无法执行索引操作。 numpy.shape仅对获取类数组对象(如列表或元组)的形状非常有用。

shape = self.data.shape

我错过了最后一点你关心的其他一些你没有展示过的昂贵计算。最好的解决方案是第一次缓存计算值,并在以后的方法调用中返回缓存值。 为了应对额外的计算

from random import random

class Data:
     @property
     def dimensions(self):
         # Do a try/except block as the exception will only every be thrown the first
         # time. Secondary invocations will work quicker and not require any checking.
         try:
             return self._dimensions
         except AttributeError:
             pass
         # some complex computation
         self._dimensions = random()
         return self._dimensions

d = Data()
assert d.dimensions == d.dimensions

答案 3 :(得分:0)

如果您的尺寸没有变化,您可以更简单。

import numpy as np

class Data:

    def __init__(self, data):
        self.data = data
        self.dimension=np.shape(self.data)

    def get_dimensions(self):
        return self.dimension


test = Data(np.random.random((20, 15)))
print(test.get_dimensions())