python 2.6 exceptions.TypeError:unbound方法_init_()ESMTP客户端实例

时间:2012-07-16 13:37:09

标签: python python-2.6 buildbot

我是Python和BuildBot的全新用户。目前我正在使用电子邮件提醒 当BuildBot构建状态发生变化时(从成功变为失败,反之亦然),每次构建失败时,失败都会发送电子邮件。我在尝试发送电子邮件时遇到以下Python错误。

--- <exception caught here> ---
**ESMTPClient.__init__(self, secret, contextFactory, *args, **kw)
exceptions.TypeError?: unbound method init() must be called with ESMTPClient 
instance as first argument (got ESMTPSender instance instead)**

我在搜索答案时在网上找到了一些此错误的例子,包括

  

你只需要将'self'作为参数传递给'Thread.init'和   调用超类

但我仍然不确定为什么会出错。我将非常感谢有关此错误发生的原因以及如何解决问题的任何指导/帮助。我不是这段代码的作者,所以我不确定要解决问题的方法。

在将以下代码从gmail帐户更改为公司帐户之前,该电子邮件正常运行。

          c['status'].append(mail.MailNotifier(
                 fromaddr="load.builder@company.co.uk",
                 extraRecipients=["example@company.com",
                      ],
                 sendToInterestedUsers=False,
                 mode=('change', 'failing'),
                 relayhost="smtp.company.lan",
                 useTls=True,
                 smtpUser="lbuilder",
                 smtpPassword="password"))

以下是产生异常的代码块:

class ESMTPSender(SenderMixin, ESMTPClient): 
    requireAuthentication = True 
    requireTransportSecurity = True 
    def __init__(self, username, secret, contextFactory=None, *args, **kw):  
        self.heloFallback = 0 
        self.username = username 

        if contextFactory is None: 
             contextFactory = self._getContextFactory() 

        ESMTPClient.__init__(self, secret, contextFactory, *args, **kw) 
        self._registerAuthenticators() 

SSA

1 个答案:

答案 0 :(得分:1)

这似乎是一个很难的例外 - 通常你不会明确地调用__init__,除非你继承其他类。在这种情况下,您可能会收到该错误:

class Foo(object):
    def __init__(self,*args):
       print("In Foo, args:",args,type(self))

class Bar(object):
    def __init__(self,*args):
        Foo.__init__(self,*args)  #Doesn't work.  Complains that the object isn't the right type.

要解决此问题,我们可以Bar继承Foo

class Bar(Foo):
         #^ Bar now inherits from Foo
    def __init__(self,*args):
        Foo.__init__(self,*args) #This will work now since a Bar instance is a Foo instance

如果从Bar获取Foo子类没有意义,则可以将公共代码分解为单独的函数:

def common_code(instance,*args):
    print("Common code: args",args,type(instance))

class Foo(object):
    def __init__(self,*args):
        common_code(self,*args)

class Bar(object):
    def __init__(self,*args):
        common_code(self,*args)

虽然在没有实际看到产生错误的代码的情况下很难诊断出这种问题。