2012-08-24 36 views
4

我在Python 2.7中。我一直在試驗tweepy包。有一個名爲tweepy.models.status對象的對象,其功能在此處定義爲:https://github.com/tweepy/tweepy/blob/master/tweepy/models.py如何「看」python中的對象的結構

我有一個功能,看起來像這樣:

def on_status(self, status): 
     try: 
      print status 
      return True 
     except Exception, e: 
      print >> sys.stderr, 'Encountered Exception:', e 
      pass 

我所指的對象是從on_status功能之一返回,叫status。當print status行執行我得到這個打印在屏幕上;

tweepy.models.Status object at 0x85d32ec>

我的問題其實很通用。我想知道如何直觀地打印出status對象的內容?我想知道該對象內有哪些信息可用。

我試過for i, v in status :的方法,但它說這個對象是不可迭代的。並不是所有的對象屬性都在函數定義中描述。

非常感謝!

+1

爲受歡迎的+1。我通常只是使用'dir',但現在來自mgilson的答案給了我一些更具體的重用。想要添加:Dive Into Python(對於第2版,第一個版本)有一章[使用'apihelper'->'info'函數進行自省](http://www.diveintopython.net/power_of_introspection/index.html)。還提供了一些關於成員等的有用信息,以及來自文檔字符串的文檔。 – aneroid

回答

9

你可以遍歷status.__dict__.items()

for k,v in status.__dict__.items(): #same thing as `vars(status)` 
    print k,v 

如果類使用__slots__並沒有一個插槽__dict__上述方法將無法正常工作。 __slots__雖然很少見,但不太可能成爲問題。

或者,你可以使用dir builtingetattr

for attr in dir(status): 
    print attr, getattr(status,attr) 

這樣確實與__slots__類,但如果自定義__getattr__定義一些限制(見鏈接,並__dict__將在同一個挨辦法)。

最後,如果你想真正精細地控制你看到的內容(例如,如果你只是想要方法),你可以檢查一下inspect module中的一些好東西。

+0

所以我嘗試了你的第一個建議,並得到這個錯誤:'遇到的例外:太多的值解壓縮......似乎像一些巨大的數據。 –

+0

第二個建議效果很好! atir in dir(status)'。謝謝! –

+0

@jeffery_the_wind - 對不起,第一個。 (我的程序員錯誤)。 'status .__ dict__'是字典。要遍歷字典中的鍵/值對,您需要使用「項目」方法。更新。 – mgilson

5

我一直是dir內建的手動內省的粉絲。工程於模塊,對象...

>>> import math 
>>> dir(math) 
['__doc__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 
'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 
'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 
'gamma', 'hypot', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 
'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc'] 

我相信這是相當於sorted(對象.__dict__.keys())