2017-11-25 226 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