簡體   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