问题描述
我记得曾经写过一个类并定义了__init__
方法时,我试图设置一个属于同一类的实例,如下例所示:
class Complex:
def __init__(self,real,imag):
self.real = real
self.imag = imag
self.conjugate = Complex(real,- imag) # instance of the same class
Compex(1,2) # RecursionError: maximum recursion depth exceeded
但是当我尝试代码时,我很快意识到我已经使__init__
方法具有递归性。结果,它将创建一个无限循环,因此我为实例定义了一个方法。我将其作为一个课程,然后继续学习,直到找到这种在numpy中转置矩阵的方式:
A = np.array([
[1,2],[3,4]
])
A.T # array([[1,3],[2,4]])
我的问题是,这如何不会像我之前的示例那样导致无限循环?
解决方法
这是定义类的正确方法,这恰好也是numpy定义转置的方式:
class Complex:
def __init__(self,real,imag):
self.real = real
self.imag = imag
@property
def conjugate(self):
return Complex(self.real,-self.imag)
通过将属性设为按需计算的property
,可以避免递归错误。
数组的转置会创建一个新的数组对象,其形状和步幅都相反。数组数据不会被复制,因此操作非常便宜。