2013-03-07 95 views
0

我的问题是,该行后:-> self.__serverUrl = serverUrlPython的 - 对象属性分配失败

这是为什么我使用节奏口技的情况下?: *** AttributeError: Client instance has no attribute '__serverUrl'

详细

与Salesforce互动,我得到一个错误

*** AttributeError: Client instance has no attribute '_Client__serverUrl'

我想知道为什么这个字段被设置之前被访问,所以我加了pdb.set_trace()认为我能找到一些答案。这是我看到的(注意行67):

(Pdb) 
--Call-- 
> /app/env/local/lib/python2.7/site-packages/beatbox/_beatbox.py(65)useSession() 
-> def useSession(self, sessionId, serverUrl): 
(Pdb) l 
64   # initialize from an existing sessionId & serverUrl, useful if we're being launched via a custom link 
65 ->  def useSession(self, sessionId, serverUrl): 
66    self.sessionId = sessionId 
67    self.__serverUrl = serverUrl 
68    (scheme, host, path, params, query, frag) = urlparse(self.__serverUrl) 
69    self.__conn = makeConnection(scheme, host) 
70 

我检查serverUrl的值,并且全部都是它应该的。然后我到达第67行,让它执行并认为serverUrl的值将在self.__serverUrl中。显然不是....

> /app/env/local/lib/python2.7/site-packages/beatbox/_beatbox.py(67)useSession() 
-> self.__serverUrl = serverUrl 
(Pdb) n 
> /app/env/local/lib/python2.7/site-packages/beatbox/_beatbox.py(68)useSession() 
-> (scheme, host, path, params, query, frag) = urlparse(self.__serverUrl) 
(Pdb) self.__serverUrl 
*** AttributeError: Client instance has no attribute '__serverUrl' 

发生了什么!?在这里这不应该发生。看起来这项任务只是悄然失败。为什么这个值不在这里?

来源

我正在使用的源代码是here

我创建了一个口技客户端并登录

svc = PythonClient() 
svc.login(username, password) 

这就要求python_client.Client的登录方法。 python_client.Client.login调用它的login方法的超_beatbox.Client,它看起来像这样:

class Client: 
    def __init__(self, serverUrl=None): 
     ... 

    # login, the serverUrl and sessionId are automatically handled, returns the loginResult structure  
    def login(self, username, password): 
     lr = LoginRequest(self.serverUrl, username, password).post() 
     self.useSession(str(lr[_tPartnerNS.sessionId]), str(lr[_tPartnerNS.serverUrl])) 
     return lr 

    # initialize from an existing sessionId & serverUrl, useful if we're being launched via a custom link 
    def useSession(self, sessionId, serverUrl): 
     self.sessionId = sessionId 
     self.__serverUrl = serverUrl 
     (scheme, host, path, params, query, frag) = urlparse(self.__serverUrl) 
     self.__conn = makeConnection(scheme, host) 

处理分配的发生在_beatbox.Client.useSession,这是对象的超svc

+1

这是它吗?是'_Client__serverUrl'还是'__serverUrl'?你可能是名字的受害者... – mgilson 2013-03-07 19:21:07

+0

在这个方法之外,它是_Client_serverUrl,在_serverUrl的方法里面。在类方法中不会发生名称修饰吗? – munk 2013-03-07 19:21:59

回答

2

名称前缀为双下划线(而不是后缀为双下划线)的名称是当它们出现在类范围内时发生了重大的。名称被前缀_<classname>毁坏。

如果您在全局范围声明了一个函数,该函数设置了一个带双下划线前缀的名称,您将设置错误的属性,因为不会发生名称重组。如果你在派生类中声明了这样一个函数,那么你也将访问错误的属性,因为名称修改将添加派生类的名称而不是基类(因此,名称修改实现了一种弱形式的私有属性)。

如果子类需要访问属性或使用属性,那么要做的恰当事情就是避免名称完全变形。如果你不能避免它,你将不得不使用这种杂草:

self._Client__serverUrl = ...