2017-11-25 290 views
-3

我想在迭代它時獲取任何屬性的名稱。獲取屬性名稱

的ts3defines.py看起來像this

class VirtualServerProperties(object): 
    VIRTUALSERVER_UNIQUE_IDENTIFIER = 0 
    VIRTUALSERVER_NAME = 1 
    VIRTUALSERVER_WELCOMEMESSAGE = 2 
    VIRTUALSERVER_PLATFORM = 3 
    VIRTUALSERVER_VERSION = 4 
    VIRTUALSERVER_MAXCLIENTS = 5 
    VIRTUALSERVER_PASSWORD = 6 
    VIRTUALSERVER_CLIENTS_ONLINE = 7 
    VIRTUALSERVER_CHANNELS_ONLINE = 8 
    VIRTUALSERVER_CREATED = 9 
    VIRTUALSERVER_UPTIME = 10 
    VIRTUALSERVER_CODEC_ENCRYPTION_MODE = 11 
    VIRTUALSERVER_ENDMARKER = 12 

getItems(object)功能看起來像this

def getItems(object): 
    return [getattr(object, a) for a in dir(object) 
       if not a.startswith('__') and not callable(getattr(object, a))] 

有問題的代碼看起來像this

for var in getItems(ts3defines.VirtualServerProperties): 
    (err, var) = ts3.getServerVariable(schid, var) 
    if err == ts3defines.ERROR_ok and var != "" and var != 0: 
     i.append('{0}: {1}'.format(var.__name__, var)) 

我的問題是關於var.__name__不應該返回字符串VIRTUALSERVER_BLA等?

它爲什麼會導致?

11/25/2017 16:07:44 pyTSon.PluginHost.infoData Error Error calling infoData of python plugin Extended Info: Traceback (most recent call last): 
    File "C:/Users/blusc/AppData/Roaming/TS3Client/plugins/pyTSon/scripts\pluginhost.py", line 476, in infoData 
    data = p.infoData(schid, aid, atype) 
    File "C:/Users/blusc/AppData/Roaming/TS3Client/plugins/pyTSon/scripts\info\__init__.py", line 160, in infoData 
    return self.getServerInfo(schid) 
    File "C:/Users/blusc/AppData/Roaming/TS3Client/plugins/pyTSon/scripts\info\__init__.py", line 148, in getServerInfo 
    i.append('{0}: {1}'.format(var.__name__, var)) 
AttributeError: 'int' object has no attribute '__name__' 
+1

什麼'var'值'ts3.getServerVariable(schid,VAR)'回報?一般來說,Python對象沒有'__name__'屬性(例如'int's),那麼你爲什麼期待它? – martineau

回答

2

我不明白你爲什麼要訪問__name__。您的getItems方法中已有名稱;它是a。你應該返回並在循環中使用它。

def getItems(object): 
    return [(a, getattr(object, a)) for a in dir(object) 
      if not a.startswith('__') and not callable(getattr(object, a))] 

...

for name, var in getItems(ts3defines.VirtualServerProperties): 
    (err, var) = ts3.getServerVariable(schid, var) 
    if err == ts3defines.ERROR_ok and var != "" and var != 0: 
     i.append('{0}: {1}'.format(name, var)) 
+0

真棒,謝謝:-) – Bluscream