2016-12-02 70 views
-1

我有以下方法:Python。如何採取自定義類型的對象從* ARGS

def _loginEventHandler(cmdID, *args): 
    if cmdID == Login.LOGIN_LOGED: 
     user = args[0] 
     print("User",user.userTypeID,"logged in") 

該方法被稱爲像這樣從不同的模塊:

user = User(nUserSelected)  
_loginEventHandler(Login.LOGIN_LOGED,user) 

解釋拋出一個AttributeError:

file "/main.py", line 79, in _loginEventHandler print("User",user.userTypeID,"logged in") AttributeError: 'tuple' object has no attribute 'userTypeID'

問題是什麼是從正確的方式採取參數*參數(特別是如果他們是自定義類型像「用戶」),爲什麼它採取從args中取出元組[0]

+0

您的打印語句有一個元組。也許你想刪除括號。 – Marichyasana

回答

1

您在方法的定義中沒有包含self。傳遞給方法的第一個參數始終是實例本身。這意味着在你的方法中,cmdID取實例的值,並且args的第一個元素實際上是Login.LOGIN_LOGED的值,其大概是元組。

+0

_loginEventHandler是一個模塊方法,而不是一個類方法,這就是爲什麼沒有自我屬性。在編輯「_loginEventHandler」之前,我編輯了這個問題以消除「自我」,這是從原始代碼中複製出來的錯誤,因爲它有點複雜,我試圖使問題簡單直接。 – MorgoZ

+0

好吧,我懷疑你的編輯隱藏了問題。實際上,除非用戶是一個返回元組的函數,否則這段代碼不會給出你說明的問題。也許你應該嘗試在你的函數中打印'args'和/或'args [0]'的值來看看發生了什麼。 –

0

所以我試圖想出一個最小版本的用戶類和登錄枚舉。但我在這裏沒有看到任何問題。輸出似乎還好

from enum import Enum 

class Login(Enum): 
    LOGIN_LOGED = 1 

class User: 
    def __init__(self, userTypeID): 
     self.userTypeID = userTypeID 


user = User(1)  
_loginEventHandler(Login.LOGIN_LOGED, user) 

這給

('User', 1, 'logged in') 
相關問題