我有一个返回数组的Python对象的属性,现在,我可以设置该属性的setter,这样整个数组都是可设置的,但是,我不知道如何通过该属性使元素本身是可设置的。
从用户的Angular 来看(给定一个空的SomeClass
类):
>>> x = SomeClass()
>>> x.array = [1, 2, 3]
>>> x.array[1] = 4
>>> print (x.array)
[1, 4, 3]
现在,假设SomeClass.array
是一个属性,定义为
class SomeClass(object):
def __init__(self, a):
self._a = a
@property
def array(self):
return self._a
@array.setter
def array(self, a):
self._a = a
所有的东西仍然和上面一样工作。如果我在setter上强制使用简单的NumPy数组。
然而,如果我用NumPy函数(以矢量化的方式通过元素)替换return self._a
,并用反函数替换self._a = a
,当然条目不会再被设置。
示例:
import numpy as np
class SomeClass(object):
def __init__(self, a):
self._a = np.array(a)
@property
def array(self):
return np.sqrt(self._a)
@array.setter
def array(self, a):
self._a = np.power(a, 2)
现在,用户将看到以下输出:
>>> x = SomeClass([1, 4, 9])
>>> print (x.array)
array([1., 2., 3.])
>>> x.array[1] = 13
>>> print (x.array) # would expect an array([1., 13., 3.]) now!
array([1., 2., 3.])
我想我明白问题出在哪里了(NumPy在操作过程中创建的数组的元素发生了变化,但对存储的数组没有影响)。SomeClass
的正确实现是什么,可以使数组的单个元素可以单独写访问,从而也可以设置?
非常感谢你的提示和帮助,TheXMA
Jaime在他的回答下面所做的几点对我帮助很大!谢谢!
1条答案
按热度按时间rdlzhqv91#
由于数组是可变对象,因此即使没有setter函数,单个项也是可设置的:
这是元组与列表的一种用法,因为后者是可变的,而前者不是。无论如何,回答你的问题:只要getter返回对象本身,就可以很容易地设置单个项。
第二个示例中的更好的性能似乎不容易通过任何简单的方式获得。我认为您可以通过将
SomeClass.array
属性设置为定制类来实现这一点。定制类可以是ndarray
的子类,也可以是它的一个示例。无论哪种方式,都需要大量的工作。