Python对象属性分配失败

2024-05-31 23:31:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我的问题是,在这一行之后:-> self.__serverUrl = serverUrl

为什么会这样?: *** AttributeError: Client instance has no attribute '__serverUrl'

详细信息

我正在使用Beatbox与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中。显然不是。。。。在

^{pr2}$

这是怎么回事!?这不应该发生。看来这项任务只是悄悄地失败了。为什么不在这里赋值?在

来源

我使用的源代码是here

我创建一个beatbox客户端并登录

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

这将调用python的login方法_客户。客户. Python_客户端.login调用其超类的login方法_beatbox客户,如下所示:

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的超类


Tags: selfclienthost客户defusernameloginpassword
1条回答
网友
1楼 · 发布于 2024-05-31 23:31:17

当名称出现在类作用域中时,以双下划线为前缀(且不以双下划线作为后缀)的名称将被损坏。名称被前缀_<classname>弄乱。在

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

如果子类需要访问属性或使用属性,正确的做法是避免名称完全混乱。如果你不能避免,你就得用这个词:

self._Client__serverUrl = ...

相关问题 更多 >