我正在尝试创建一个具有其中的函数的类,该类将在类中的稍后方法中调用,而不会将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.)
答案 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):