繁体   English   中英

Python:使用class实例的“值”作为指定class实例属性的值

[英]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_arraya_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.ndarrayexample_two_dimensional_array.dimension_one_size = 2example_two_dimensional_array.dimension_two_size = 3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM