classobj'对象不可下标索引

2 投票
1 回答
3542 浏览
提问于 2025-04-16 20:45

我在一个类的方法里用 self.methodname() 调用另一个类的方法时,遇到了以下错误。

TypeError: 'classobj' object is not subscriptable

这可能是什么问题呢?其他的方法都能正常运行,就这个不行。代码的具体情况是

class loadbalancer:
    def __init__(self):
        #somecode
    def upload_config(self,loadbalancer_doc)
        #some code
    def create_loadbalancer(self,loadbalancer_doc)
        self.upload_config(loadbalancer_doc)#trace back shows here i get this error

这是 upload_config 方法:

def upload_config(self,loadbalancer_doc):
    no_of_ports=len(loadbalancer_doc['frontend_ports'])    
    loadbalancer_config=''
    for i in range(0, no_of_ports):
        servers=''
        for server_uuid in loadbalancer_doc['backend_servers']:
            ip='192.168.1.1'
            server_id=self.vms_collection.find_one({'_id':server_uuid}, {'id':1})['id']
            servers=servers+'\tserver '+server_id+' '+ip+':'+loadbalancer_doc['backend_ports'][i]\
                    +' check port '+loadbalancer_doc['check_port']+' inter '+loadbalancer_doc['check_interval']+'\n'
        loadbalancer_config=loadbalancer_config+'listen '+loadbalancer_doc['_id']+\
                            str(i)+'\n\tbind '+loadbalancer_doc['frontend_ip']+':'+loadbalancer_doc['frontend_ports'][i]\
                            +'\n\toption '+loadbalancer_doc['check_protocol']+' '+loadbalancer_doc['check_protocol_param']+'\n'+servers+'\n'

    with open(LOCAL_DIR+loadbalancer_doc['_id'], 'w') as f:
        f.write(loadbalancer_config)
    try:    
        filenames=self.loadbalancer_collection.find({'destroyed_time':0})
    except Exception,err:
        os.remove(LOCAL_DIR+loadbalancer['_id'])
        raise(err)
    if not(filenames):
        os.remove(LOCAL_DIR+loadbalancer['_id'])
        raise Exception('no cursor returned')
    configfiles=''
    for file in filenames:
        configfiles=configfiles+' -f '+REMOTE_CONFIG_FILE+file['_id']

    try:
        self._put_file(LOCAL_DIR+loadbalancer_doc['_id'],REMOTE_CONFIG_FILE+loadbalancer_doc['_id'])
    except Exception,err:
        os.remove(LOCAL_DIR+loadbalancer['_id'])
        raise Exception('copying config file to remote server failed'+str(err))

    try:
        self._exec_command('haproxy'+\
                                   ' -f /etc/haproxy/haproxy.cfg'+configfiles+\
                                   ' -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)')
    except Exception,err:
        os.remove(LOCAL_DIR+loadbalancer['_id'])
        #command_op=commands.getstatusoutput('ssh -i '+SSH_KEYFILE+' '+SSH_LOGIN+' rm '+REMOTE_CONFIG_FILE+loadbalancer_doc['_id'])
        raise Exception('haproxy restart failed, err: '+str(err))

1 个回答

3

你可能有这样的代码:

balancer = loadbalancer
balancer.create_loadbalancer(...)

跟C++不一样,在创建一个对象的时候,即使__init__没有参数,你也需要加上括号:

balancer = loadbalancer()
balancer.create_loadbalancer(...)

在前面的例子中,balancer是类的对象,而不是这个类的实例。

编辑:

这些代码可能会引发问题:

    except Exception,err:
        os.remove(LOCAL_DIR+loadbalancer['_id'])
        raise(err)
    if not(filenames):
        os.remove(LOCAL_DIR+loadbalancer['_id'])
        raise Exception('no cursor returned')

你想用loadbalancer['_id']做什么呢?

撰写回答