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

Python-在类本身中创建共享类变量,python,Python,我对Python很陌生,我一直面临一个问题,在stackoverflow上找不到直接的答案(但我想我只是没有足够的经验在google上搜索正确的术语)。我希望您能提供帮助您可以将结果缓存为成员变量(如果我正确理解了问题): 您可以将结果缓存为成员变量(如果我正确理解了问题): 当然,你可以这样做: class Data: def __init__(self, data): self.data = data self.dimensions = None

我对Python很陌生,我一直面临一个问题,在stackoverflow上找不到直接的答案(但我想我只是没有足够的经验在google上搜索正确的术语)。我希望您能提供帮助您可以将结果缓存为成员变量(如果我正确理解了问题):


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


当然,你可以这样做:

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

当然,你可以这样做:

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

数组的形状直接存储在数组中,而不是计算值。阵列的形状必须存储,因为备份内存是平面阵列。因此,
(4,4)
(2,8)
(16,)
将具有相同的支持数组。如果不存储形状,数组将无法执行索引操作
numpy.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

数组的形状直接存储在数组中,而不是计算值。阵列的形状必须存储,因为备份内存是平面阵列。因此,
(4,4)
(2,8)
(16,)
将具有相同的支持数组。如果不存储形状,数组将无法执行索引操作
numpy.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

如果你的维度没有改变,你可以做得更简单

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())

如果你的维度没有改变,你可以做得更简单

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())

问题是,你从来没有设置过尺寸,所以你总是重复计算,然后返回,而不是使用以前计算的结果…啊,不知道我能做到@亩無 对的现在解决这个问题。问题是,你从来没有设置过尺寸,所以你总是重复计算然后返回,而不是使用以前计算的结果…啊,不知道我能做到@亩無 对的现在就修好。好的,我明白了。因此,如果我只想返回单个数组的形状,我发现不需要重写上面的语句。然而,在我的get_dimensions函数中,我做的不仅仅是返回形状,所以我真的想避免一直执行额外的步骤,好的,注意点。因此,如果我只想返回单个数组的形状,我发现不需要重写上面的语句。然而,在我的get_dimensions函数中,我做的不仅仅是返回形状,所以我真的希望避免一直执行额外的步骤