Python OO - определение функции-члена и ключевое слово self - PullRequest
0 голосов
/ 22 февраля 2012

Я пишу класс Python с помощью этого конструктора:

      #constuctor
def __init__(self, initPt_=[1,1],fun_=Optim_tests.peaks,NITER_=30,alpha_=0.7,NMAX_=5000,FTOL_=10**(-10)):
    self.initPt = initPt_
    self.fun = fun_
    self.alpha = alpha_
    self.ITER = NITER_
    self.NMAX = NMAX_
    self.FTOL = FTOL_

и определение обеих функций-членов:

def buildSimplex(self):
    self.simplex=[]
    self.simplex.append([x for x in self.initPt])
    for i in range(len(self.initPt)):
        temp=[x for x in self.initPt]
        temp[i]=self.initPt[i]+1
        self.simplex.append(temp)
    self.npts=len(self.simplex)

def sA(self):
    self.buildSimplex()

При вызове вторых функций происходит ошибка:

NameError: global name 'buildSimplex' is not defined    

У вас есть подсказка?

Ответы [ 2 ]

3 голосов
/ 22 февраля 2012

На первый взгляд, я бы сказал, что это проблема с идентификацией, но вам нужно предоставить реальный код для более конкретного ответа.

Причина, по которой я говорю это из-за ошибки, которую вы получаете. Если вы правильно объявили свой класс и пытаетесь вызвать метод экземпляра, который не является определением, вы должны получить: AttributeError: A instance has no attribute 'xxxx'. И вам не нужно заботиться о порядке определения ваших методов, если они объявлены в классе. См. Пример met1 и met4 ниже

Например:

class A():
   def met1(self):
      print self.met4()

   def met2(self):
      self.met3()

   def met4():
      print 'x'


 a = A()
 a.met1()
 >>> x
 a.met2()
 >>> AttributeError: A instance has no attribute 'met3'
0 голосов
/ 22 февраля 2012

Ваша ошибка NameError: global name 'buildTool1' is not defined говорит о том, что вы пытаетесь получить доступ к переменной buildTool1 Но она не определена в локальном или глобальном.

Пожалуйста, отметьте это

class test(object):

    def __init__(self, name):
        self.name = name

    def buildSimplex(self):
        print "CALL"

    def sA(self):
        self.buildSimplex()


if __name__ == '__main__':
    x = test('test')
    x.sA()
...