在实例变量外使用类方法/属性

1 投票
2 回答
1296 浏览
提问于 2025-04-17 19:48

我有一个类,内容如下:

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)

这个体积函数和我在类里定义的@property完全一样。为了让这段代码能正常工作,我不得不把类里的@property复制粘贴成一个普通的函数,像这样:

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

我一直听说,复制粘贴代码说明我做错了什么。所以我想问,有没有办法重新设计我的类,这样我就可以在不创建实例的情况下调用我在Spheroid类里定义的体积@property/方法,这样Z = vol(X,Y)就能正常工作了?

谢谢

2 个回答

0

如果你的目标是让 vol(x, y) 这个功能正常工作,你可以定义一个 vol 函数,让它根据传入的参数创建一个新对象,然后返回这个对象。

或者,你可以在你的 spheroid 类里创建一个叫 Vol 的函数,并把这个函数设置为静态的。这样,你就可以让这个函数的实例版本去调用静态版本。

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)

撰写回答