Python 为什么对象没有已在另一个模块中定义的属性?

Python 为什么对象没有已在另一个模块中定义的属性?,python,Python,我正在测试一个写在网站上并发布的代码 代码部分位于网页的底部。运行测试代码mainpova.py时,出现语法错误 语法错误是 python mainprova4.py Best solution is ((3*(1*2))+x) with error 20.0... Producing gen number 2... Traceback (most recent call last): File "mainprova4.py", line 68, in <module> main

我正在测试一个写在网站上并发布的代码

代码部分位于网页的底部。运行测试代码mainpova.py时,出现语法错误

语法错误是

python mainprova4.py
Best solution is ((3*(1*2))+x) with error 20.0...
Producing gen number 2...
Traceback (most recent call last):
 File "mainprova4.py", line 68, in <module>
main()
 File "mainprova4.py", line 62, in main
gen.next(crossoverPerc, mutationPerc, randomPerc, copyPerc,shouldPruneForMaxHeight, minHeight, maxHeight, minValue, maxValue, variables, operators)
AttributeError: 'Generation' object has no attribute 'next'
我不认为这是压痕问题。我在这里错过了什么。 具有下一个定义的代码是

import random as rnd
import generator as gtr
import treeOperations as trop

class Generation(object):
    def __init__(self):
      self.membersWithErrors = []

    def addMember(self, member):
      """ Add a tree to the generation """
      self.membersWithErrors.append([member, 0])

    def setMember(self, member, index):
      """ Updates the member at the specified position """
      self.membersWithErrors[index] = member

    def setError(self, index, error):
      """ Sets the error of the member at the specified position """
      self.membersWithErrors[index][1] = error

    def getMember(self, index):
      """ Returns the member at the specified position """
      return self.membersWithErrors[index][0]

    def getError(self, index):
      """ Returns the error of the member at the specified position """
      return self.membersWithErrors[index][1]

    def size(self):
      """ Returns the number of members curently in the generation """
      return len(self.membersWithErrors)

    def clear(self):
      """ Clears the generation, i.e. removes all the members """
      self.membersWithErrors.clear()

    def sort(self, descending):
      """ Sorts the members of the generation according the their score """
      self.membersWithErrors.sort(key = lambda l: l[1], reverse = descending)

def getMembersForReproduction(self, numMembers, pickProb):
    """ Returns a certain number of distinct members from the generation.
    The first member is selected with probability pickProb. If it's not chosen, the 
    second member is selected with probability pickProb, and so on. """
    selectedMembers = []
    while len(selectedMembers) < numMembers: 
      indexSelected = 0  
      while rnd.randint(0, 100) > int(pickProb * 100) and indexSelected != len(self.membersWithErrors) - 1:
    indexSelected += 1
    memberWithErrorSelected = self.membersWithErrors[indexSelected]
    if memberWithErrorSelected[0] not in selectedMembers:
       selectedMembers.append(memberWithErrorSelected[0])
    return selectedMembers

def next(self, crossoverPerc, mutationPerc, randomPerc, copyPerc, shouldPruneForMaxHeight, minHeight, maxHeight, minValue, maxValue, variables, operators):
    """ It proceeds to the next generation with the help of genetic operations """
    oldMembersWithError = self.membersWithErrors
    newMembersWithError = []
    maxMembers = len(oldMembersWithError)

    numCrossover = int(maxMembers * crossoverPerc)
    numMutation = int(maxMembers * mutationPerc)
    numRandom = int(maxMembers * randomPerc)
    numCopy = maxMembers - numCrossover - numMutation - numRandom

    # Crossover
    for i in range(0, numCrossover):
    members = self.getMembersForReproduction(2, 0.3)
    m1 = members[0]
    m2 = members[1]
    newMember = trop.crossover(m1, m2)
    newMembersWithError.append([newMember, 0])

    # Crossover
    for i in range(0, numCrossover):
        members = self.getMembersForReproduction(2, 0.3)
        m1 = members[0]
        m2 = members[1]
        newMember = trop.crossover(m1, m2)
        if shouldPruneForMaxHeight and newMember.height() > maxHeight:
       newMember = trop.pruneTreeForMaxHeight(newMember, maxHeight, minValue, maxValue, variables)
    newMembersWithError.append([newMember, 0])

    # Mutation
    for i in range(0, numMutation):
        m1 = self.getMembersForReproduction(1, 0.3)[0]
        newMembersWithError.append([trop.mutation(m1, minValue, maxValue, variables, operators), 0])

    # Random
    for i in range(0, numRandom):
    newMembersWithError.append([gtr.getTree(minHeight, maxHeight, minValue, maxValue, variables, operators), 0])

    # Copy
    members = self.getMembersForReproduction(numCopy, 0.3)
    for m in members:
        ewMembersWithError.append([m.clone(), 0])

    self.membersWithErrors = newMembersWithError
随机导入为rnd
作为全球技术法规进口发电机
将treeOperations作为trop导入
类生成(对象):
定义初始化(自):
self.membersWithErrors=[]
def addMember(self,member):
“”“将树添加到生成中”“”
self.membersWithErrors.append([member,0])
def集合成员(自身、成员、索引):
“”“在指定位置更新成员”“”
self.membersWithErrors[索引]=成员
def setError(自身、索引、错误):
“”“在指定位置设置成员的错误”“”
self.membersWithErrors[index][1]=错误
def getMember(自身,索引):
“”“返回指定位置的成员”“”
返回self.membersWithErrors[索引][0]
def getError(自身,索引):
“”“返回指定位置的成员的错误”“”
返回self.membersWithErrors[索引][1]
def大小(自身):
“”“返回当前生成中的成员数”“”
返回len(自身成员错误)
def清除(自):
“”“清除生成,即删除所有成员”“”
self.membersWithErrors.clear()
def排序(自、递减):
“”“根据分数对这一代的成员进行排序”“”
self.membersWithErrors.sort(key=lambda l:l[1],reverse=descending)
def GetMembersForReconduction(自身、numMembers、pickProb):
“”“从生成中返回一定数量的不同成员。
使用概率pickProb选择第一个成员。如果未选择,则
使用概率pickProb选择第二个成员,依此类推
selectedMembers=[]
而len(selectedMembers)int(pickProb*100)和indexSelected!=len(自身成员错误)-1:
indexSelected+=1
memberWithErrorSelected=self.membersWithErrors[indexSelected]
如果未在selectedMembers中选择成员[0]:
selectedMembers.append(memberWithErrorSelected[0])
返回所选成员
def next(self、crossoverPerc、mutationPerc、randomPerc、copyPerc、shouldlruneformaxheight、minHeight、maxHeight、minValue、maxValue、变量、运算符):
“在遗传操作的帮助下,它将继续发展到下一代”
oldMembersWithError=self.MembersWitherRor
新成员SwitherRor=[]
maxMembers=len(oldMembersWithError)
numCrossover=int(maxMembers*crossoverPerc)
numMutation=int(maxMembers*mutationPerc)
numRandom=int(maxMembers*randomPerc)
numCopy=maxMembers-numCrossover-numMutation-numRandom
#交叉
对于范围内的i(0,numCrossover):
members=self.getmembersforreduction(2,0.3)
m1=成员[0]
m2=成员[1]
新成员=过渡渡线(m1,m2)
newMembersWithError.append([newMember,0])
#交叉
对于范围内的i(0,numCrossover):
members=self.getmembersforreduction(2,0.3)
m1=成员[0]
m2=成员[1]
新成员=过渡渡线(m1,m2)
如果shouldRuneformaxheight和newMember.height()>maxHeight:
newMember=trop.pruneTreeForMaxHeight(newMember、maxHeight、minValue、maxValue、变量)
newMembersWithError.append([newMember,0])
#突变
对于范围内的i(0,numMutation):
m1=自.GetMembersForeProduction(1,0.3)[0]
newMembersWithError.append([trop.mutation(m1,minValue,maxValue,变量,运算符),0])
#随机的
对于范围内的i(0,numRandom):
newMembersWithError.append([gtr.getTree(minHeight,maxHeight,minValue,maxValue,变量,运算符),0])
#抄袭
members=self.getmembersforreduction(numCopy,0.3)
对于m in成员:
ewMembersWithError.append([m.clone(),0])
self.memberswitherror=新成员switherror

您可以看到此处突出显示的错误:

import random as rnd
import generator as gtr
import treeOperations as trop

class Generation(object):
    def __init__(self):
      self.membersWithErrors = []

    def addMember(self, member):
      """ Add a tree to the generation """
      self.membersWithErrors.append([member, 0])

    def setMember(self, member, index):
      """ Updates the member at the specified position """
      self.membersWithErrors[index] = member

    def setError(self, index, error):
      """ Sets the error of the member at the specified position """
      self.membersWithErrors[index][1] = error

    def getMember(self, index):
      """ Returns the member at the specified position """
      return self.membersWithErrors[index][0]

    def getError(self, index):
      """ Returns the error of the member at the specified position """
      return self.membersWithErrors[index][1]

    def size(self):
      """ Returns the number of members curently in the generation """
      return len(self.membersWithErrors)

    def clear(self):
      """ Clears the generation, i.e. removes all the members """
      self.membersWithErrors.clear()

    def sort(self, descending):
      """ Sorts the members of the generation according the their score """
      self.membersWithErrors.sort(key = lambda l: l[1], reverse = descending)

############ INDENTATION PROBLEM ################
def getMembersForReproduction(self, numMembers, pickProb):
    """ Returns a certain number of distinct members from the generation.
    The first member is selected with probability pickProb. If it's not chosen, the 
    second member is selected with probability pickProb, and so on. """
    selectedMembers = []
    while len(selectedMembers) < numMembers: 
      indexSelected = 0  
      while rnd.randint(0, 100) > int(pickProb * 100) and indexSelected != len(self.membersWithErrors) - 1:
    indexSelected += 1
    memberWithErrorSelected = self.membersWithErrors[indexSelected]
    if memberWithErrorSelected[0] not in selectedMembers:
       selectedMembers.append(memberWithErrorSelected[0])
    return selectedMembers

############ HERE IS THE INDENTATION PROBLEM ########## 
def next(self, crossoverPerc, mutationPerc, randomPerc, copyPerc, shouldPruneForMaxHeight, minHeight, maxHeight, minValue, maxValue, variables, operators):
    """ It proceeds to the next generation with the help of genetic operations """
    oldMembersWithError = self.membersWithErrors
    newMembersWithError = []
    maxMembers = len(oldMembersWithError)

    numCrossover = int(maxMembers * crossoverPerc)
    numMutation = int(maxMembers * mutationPerc)
    numRandom = int(maxMembers * randomPerc)
    numCopy = maxMembers - numCrossover - numMutation - numRandom

    # Crossover
    for i in range(0, numCrossover):
    members = self.getMembersForReproduction(2, 0.3)
    m1 = members[0]
    m2 = members[1]
    newMember = trop.crossover(m1, m2)
    newMembersWithError.append([newMember, 0])

    # Crossover
    for i in range(0, numCrossover):
        members = self.getMembersForReproduction(2, 0.3)
        m1 = members[0]
        m2 = members[1]
        newMember = trop.crossover(m1, m2)
        if shouldPruneForMaxHeight and newMember.height() > maxHeight:
       newMember = trop.pruneTreeForMaxHeight(newMember, maxHeight, minValue, maxValue, variables)
    newMembersWithError.append([newMember, 0])

    # Mutation
    for i in range(0, numMutation):
        m1 = self.getMembersForReproduction(1, 0.3)[0]
        newMembersWithError.append([trop.mutation(m1, minValue, maxValue, variables, operators), 0])

    # Random
    for i in range(0, numRandom):
    newMembersWithError.append([gtr.getTree(minHeight, maxHeight, minValue, maxValue, variables, operators), 0])

    # Copy
    members = self.getMembersForReproduction(numCopy, 0.3)
    for m in members:
        ewMembersWithError.append([m.clone(), 0])

    self.membersWithErrors = newMembersWithError
随机导入为rnd
作为全球技术法规进口发电机
将treeOperations作为trop导入
类生成(对象):
定义初始化(自):
self.membersWithErrors=[]
def addMember(self,member):
“”“将树添加到生成中”“”
self.membersWithErrors.append([member,0])
def集合成员(自身、成员、索引):
“”“在指定位置更新成员”“”
self.membersWithErrors[索引]=成员
def setError(自身、索引、错误):
“”“在指定位置设置成员的错误”“”
self.membersWithErrors[index][1]=错误
def getMember(自身,索引):
“”“返回指定位置的成员”“”
返回self.membersWithErrors[索引][0]
def getError(自身,索引):
“”“返回指定位置的成员的错误”“”
返回self.membersWithErrors[索引][1]
def大小(自身):
“”“返回当前生成中的成员数”“”
返回len(自身成员错误)
def清除(自):
“”“清除生成,即删除所有成员”“”
self.membersWithErrors.clear()
def排序(自、递减):
“”“根据分数对这一代的成员进行排序”“”
self.membersWithErrors.sort(key=lambda l:l[1],reverse=descending)
############压痕问题################
def GetMembersForReconduction(自身、numMembers、pickProb):
“”“从生成中返回一定数量的不同成员。
使用概率pickProb选择第一个成员。如果未选择,则
使用概率pickProb选择第二个成员,依此类推
selectedMembers=[]
import random as rnd
import generator as gtr
import treeOperations as trop

class Generation(object):
    def __init__(self):
      self.membersWithErrors = []

    def addMember(self, member):
      """ Add a tree to the generation """
      self.membersWithErrors.append([member, 0])

    def setMember(self, member, index):
      """ Updates the member at the specified position """
      self.membersWithErrors[index] = member

    def setError(self, index, error):
      """ Sets the error of the member at the specified position """
      self.membersWithErrors[index][1] = error

    def getMember(self, index):
      """ Returns the member at the specified position """
      return self.membersWithErrors[index][0]

    def getError(self, index):
      """ Returns the error of the member at the specified position """
      return self.membersWithErrors[index][1]

    def size(self):
      """ Returns the number of members curently in the generation """
      return len(self.membersWithErrors)

    def clear(self):
      """ Clears the generation, i.e. removes all the members """
      self.membersWithErrors.clear()

    def sort(self, descending):
      """ Sorts the members of the generation according the their score """
      self.membersWithErrors.sort(key = lambda l: l[1], reverse = descending)

############ INDENTATION PROBLEM ################
def getMembersForReproduction(self, numMembers, pickProb):
    """ Returns a certain number of distinct members from the generation.
    The first member is selected with probability pickProb. If it's not chosen, the 
    second member is selected with probability pickProb, and so on. """
    selectedMembers = []
    while len(selectedMembers) < numMembers: 
      indexSelected = 0  
      while rnd.randint(0, 100) > int(pickProb * 100) and indexSelected != len(self.membersWithErrors) - 1:
    indexSelected += 1
    memberWithErrorSelected = self.membersWithErrors[indexSelected]
    if memberWithErrorSelected[0] not in selectedMembers:
       selectedMembers.append(memberWithErrorSelected[0])
    return selectedMembers

############ HERE IS THE INDENTATION PROBLEM ########## 
def next(self, crossoverPerc, mutationPerc, randomPerc, copyPerc, shouldPruneForMaxHeight, minHeight, maxHeight, minValue, maxValue, variables, operators):
    """ It proceeds to the next generation with the help of genetic operations """
    oldMembersWithError = self.membersWithErrors
    newMembersWithError = []
    maxMembers = len(oldMembersWithError)

    numCrossover = int(maxMembers * crossoverPerc)
    numMutation = int(maxMembers * mutationPerc)
    numRandom = int(maxMembers * randomPerc)
    numCopy = maxMembers - numCrossover - numMutation - numRandom

    # Crossover
    for i in range(0, numCrossover):
    members = self.getMembersForReproduction(2, 0.3)
    m1 = members[0]
    m2 = members[1]
    newMember = trop.crossover(m1, m2)
    newMembersWithError.append([newMember, 0])

    # Crossover
    for i in range(0, numCrossover):
        members = self.getMembersForReproduction(2, 0.3)
        m1 = members[0]
        m2 = members[1]
        newMember = trop.crossover(m1, m2)
        if shouldPruneForMaxHeight and newMember.height() > maxHeight:
       newMember = trop.pruneTreeForMaxHeight(newMember, maxHeight, minValue, maxValue, variables)
    newMembersWithError.append([newMember, 0])

    # Mutation
    for i in range(0, numMutation):
        m1 = self.getMembersForReproduction(1, 0.3)[0]
        newMembersWithError.append([trop.mutation(m1, minValue, maxValue, variables, operators), 0])

    # Random
    for i in range(0, numRandom):
    newMembersWithError.append([gtr.getTree(minHeight, maxHeight, minValue, maxValue, variables, operators), 0])

    # Copy
    members = self.getMembersForReproduction(numCopy, 0.3)
    for m in members:
        ewMembersWithError.append([m.clone(), 0])

    self.membersWithErrors = newMembersWithError
import random as rnd
import generator as gtr
import treeOperations as trop

class Generation(object):
    def __init__(self):
      self.membersWithErrors = []

    def addMember(self, member):
      """ Add a tree to the generation """
      self.membersWithErrors.append([member, 0])

    def setMember(self, member, index):
      """ Updates the member at the specified position """
      self.membersWithErrors[index] = member

    def setError(self, index, error):
      """ Sets the error of the member at the specified position """
      self.membersWithErrors[index][1] = error

    def getMember(self, index):
      """ Returns the member at the specified position """
      return self.membersWithErrors[index][0]

    def getError(self, index):
      """ Returns the error of the member at the specified position """
      return self.membersWithErrors[index][1]

    def size(self):
      """ Returns the number of members curently in the generation """
      return len(self.membersWithErrors)

    def clear(self):
      """ Clears the generation, i.e. removes all the members """
      self.membersWithErrors.clear()

    def sort(self, descending):
      """ Sorts the members of the generation according the their score """
      self.membersWithErrors.sort(key = lambda l: l[1], reverse = descending)

    ########## YOU HAVE TO FIX THIS TOO ############
    def getMembersForReproduction(self, numMembers, pickProb):
        """ Returns a certain number of distinct members from the generation.
        The first member is selected with probability pickProb. If it's not chosen, the 
        second member is selected with probability pickProb, and so on. """
        selectedMembers = []
        while len(selectedMembers) < numMembers: 
          indexSelected = 0  
          while rnd.randint(0, 100) > int(pickProb * 100) and indexSelected != len(self.membersWithErrors) - 1:
        indexSelected += 1
        memberWithErrorSelected = self.membersWithErrors[indexSelected]
        if memberWithErrorSelected[0] not in selectedMembers:
           selectedMembers.append(memberWithErrorSelected[0])
        return selectedMembers

    ############ This is the proper identation #############
    def next(self, crossoverPerc, mutationPerc, randomPerc, copyPerc, shouldPruneForMaxHeight, minHeight, maxHeight, minValue, maxValue, variables, operators):
        """ It proceeds to the next generation with the help of genetic operations """
        oldMembersWithError = self.membersWithErrors
        newMembersWithError = []
        maxMembers = len(oldMembersWithError)

        numCrossover = int(maxMembers * crossoverPerc)
        numMutation = int(maxMembers * mutationPerc)
        numRandom = int(maxMembers * randomPerc)
        numCopy = maxMembers - numCrossover - numMutation - numRandom

        # Crossover
        for i in range(0, numCrossover):
        members = self.getMembersForReproduction(2, 0.3)
        m1 = members[0]
        m2 = members[1]
        newMember = trop.crossover(m1, m2)
        newMembersWithError.append([newMember, 0])

        # Crossover
        for i in range(0, numCrossover):
        members = self.getMembersForReproduction(2, 0.3)
        m1 = members[0]
        m2 = members[1]
        newMember = trop.crossover(m1, m2)
        if shouldPruneForMaxHeight and newMember.height() > maxHeight:
           newMember = trop.pruneTreeForMaxHeight(newMember, maxHeight, minValue, maxValue, variables)
        newMembersWithError.append([newMember, 0])

        # Mutation
        for i in range(0, numMutation):
            m1 = self.getMembersForReproduction(1, 0.3)[0]
            newMembersWithError.append([trop.mutation(m1, minValue, maxValue, variables, operators), 0])

        # Random
        for i in range(0, numRandom):
        newMembersWithError.append([gtr.getTree(minHeight, maxHeight, minValue, maxValue, variables, operators), 0])

        # Copy
        members = self.getMembersForReproduction(numCopy, 0.3)
        for m in members:
            ewMembersWithError.append([m.clone(), 0])

        self.membersWithErrors = newMembersWithError