1

我有一堂课如下:

class Spheroid(object):                                                                                                                                                        
  def __init__(self,shortt,longg):                                                                                                                                           
    self.shortax = shortt                                                                                                                                                  
    self.longax  = longg                                                                                                                                                   
    self.alpha=self.longax/self.shortax                                                                                                                                    

  @property                                                                                                                                                                                                                                                                                                                                           
  def volume(self):                                                                                                                                                          
    return (4*np.pi/3) * self.shortax * self.shortax * self.longax

在稍后的一段代码中,我使用了一个音量函数,如下所示:

x=np.arange(5,8.5,dx)
y=np.arange(5,30,dy)
X,Y = np.meshgrid(x,y)

Z = vol(X,Y)

vol 函数与我在课堂上定义的@property 完全相同。为了让这段代码正常工作,我必须复制并粘贴 @property 类并将其转换为如下常规函数:

def vol(a,b):
    return (4*np.pi/3) * a * a * b

我总是被告知复制和粘贴代码是我做错了什么的标志。所以我的问题是,有没有一种方法可以重新设计我的类,以便在不创建实例的情况下调用我在该 Spheroid 类中定义的卷 @property / 方法,以便 Z = vol(X,Y) 可以工作?

谢谢

4

2 回答 2

0

如果您的目标是使 vol(x, y) 工作,您可以定义 vol 来创建一个带有传递给它的参数的新对象,调用该属性,然后返回。

或者你可以在你的球体类上创建一个名为 Vol 的函数,并将该函数设为静态。然后你可以让那个函数的实例版本只调用静态版本。

于 2013-03-20T22:23:06.020 回答
0

我会遵循 scott_fakename 的建议并使用这样的静态方法:

class Spheroid(object):

    def __init__(self, shortt, longg):
        self.shortax = shortt
        self.longax = longg
        self.alpha = self.longax / self.shortax

    @property
    def vol(self):
        return Spheroid.volume(self.shortax, self.longax)

    @staticmethod
    def volume(shortax, longax):
        return (4 * np.pi / 3) * shortax * shortax * longax

# outside the instance call it like this
Spheroid.volume(X, Y)
于 2013-03-20T22:32:48.573 回答