函数不在类中传递self

时间:2015-12-04 20:44:35

标签: python

我正在尝试创建一个具有其中的函数的类,该类将在类中的稍后方法中调用,而不会将self传递给该函数。这是我当前的代码,但是python IDLE会引发有关Vbond未定义的错误。

class Ozone(descent.Descent):
    def __init__(self, intervals):
        super(Ozone,self).__init__(intervals)
        self.Leq = 1.25
        self.phieq = 2.11
        self.kbond = 20.
        self.kbend = 12.

    def Vbond(L):
        return self.kbond*(((self.Leq/(math.sqrt(2)-L))**4)-((self.Leq/(math.sqrt(2)-L)**2)))

    def Vbend(phi):
        return self.kbend*((phi-self.phieq)**2)*((phi-0.5(math.pi-self.phieq))**2)

    def f(self, x):  # x[0] = L, x[1] = phi
        Vtot = Vbond(2.*x[0]*math.sin(x[1]/2)) + 2.*(Vbond(x[0])) + \
               + Vbend(x[1]) + Vbend((2*math.pi-x[1])/2.)

2 个答案:

答案 0 :(得分:0)

Python总是将对象传递给它的实例方法。该参考是该方法如何访问其自己的对象数据。传统上我们称这个变量为self,但它不是语言的要求。当您定义这样的方法时:

def Vbond(L):
    return self.kbond*(((self.Leq/(math.sqrt(2)-L))**4)-((self.Leq  /(math.sqrt(2)-L)**2)))

您已经定义了一个方法,其对象引用称为L,并且不带任何其他参数。只需将其更改为以传统方式包含self即可。

def Vbond(self, L):
    return self.kbond*(((self.Leq/(math.sqrt(2)-L))**4)-((self.Leq/(math.sqrt(2)-L)**2)))

此外,在调用其实例方法时,需要使用self告诉python您正在引用哪个对象。

Vtot = self.Vbond(2.*x[0]*math.sin(x[1]/2)) + 2.*(self.Vbond(x[0])) + \
           + self.Vbend(x[1]) + self.Vbend((2*math.pi-x[1])/2.)

答案 1 :(得分:0)

更改

def Vbond(L):

代表

def Vbond(self, L):

...和Vbend函数相同:

def Vbend(self, phi):