[英]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.