2016-12-02 92 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') 
相关问题