[英]Python: Use the "value" of a class instance as the value of a specified class instance attribute
我对 Python 比较陌生,有一个关于访问 class 实例属性的问题。
考虑下面的例子
import numpy as np
class TwoDimensionalArray:
def __init__(self, input_array):
self.dimension_one_size = input_array.shape[0]
self.dimension_two_size = input_array.shape[1]
self.value = my_array
# Create an instance of the class TwoDimensionalArray.
numpy_array = np.array([[1, 2, 3], [4, 5, 6]])
example_two_dimensional_array = TwoDimensionalArray(numpy_array)
我的实际代码比这个例子复杂一点; 要求此功能的动机是我不想在我的代码库中编写numpy_array.shape[0]
或numpy_array.shape[1]
,而是维度必须具有适合手头业务逻辑的名称。
是否有可能以某种方式修改 class TwoDimensionalArray
,这样您就可以获得输入数组而不必编写a_different_array = example_two_dimensional_array.value
(即访问属性value
),而是使用简化a_different_array = example_two_dimensional_array
即a_different_array
然后等于np.array([[1, 2, 3], [4, 5, 6]])
即type(a_different_array) = type(numpy_array) = numpy.ndarray
而不是type(a_different_array) = TwoDimensionalArray
?
在这里找到解决方案: https://numpy.org/doc/stable/user/basics.subclassing.html#simple-example-adding-an-extra-attribute-to-ndarray 。
似乎正确的实现方式如下
class TwoDimensionalArray(np.ndarray):
def __new__(cls, input_array):
obj = np.asarray(input_array).view(cls)
obj.dimension_one_size = input_array.shape[0]
obj.dimension_two_size = input_array.shape[1]
return obj
def __array_finalize__(self, obj):
if obj is None: return
self.dimension_one_size = getattr(obj, 'dimension_one_size', None)
self.dimension_two_size = getattr(obj, 'dimension_two_size', None)
numpy_array = np.array([[1, 2, 3], [4, 5, 6]])
example_two_dimensional_array = TwoDimensionalArray(numpy_array)
我们现在有两个额外的属性添加到np.ndarray
: example_two_dimensional_array.dimension_one_size = 2
和example_two_dimensional_array.dimension_two_size = 3
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.