2013-03-20 81 views
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类中定义的volume @property/method,以便Z = vol(X,Y)可以工作?

感谢

+2

否 - 该功能将参数和方法作用于类属性。所以你最好保留'vol'函数,并将'volume'属性重新定义为'return vol(self.shortax,self.longax)'。然后,音量表达式在'vol'函数中只定义一次(更容易维护)。 – isedev 2013-03-20 22:21:06

+0

@isedev我有同样的想法,但你继续并提交它;) – jamylak 2013-03-20 22:21:53

回答

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) 
+0

是的,我更喜欢...删除我的答案。 – isedev 2013-03-20 22:33:46

0

如果你的目标是使卷(X,Y)的工作,你可以定义卷来创建传递给它的参数的新对象,调用该属性,然后返回。

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