2016-12-16 68 views
1

例如,如果我讀一些代碼,是這樣的:在編寫/讀取python代碼時,人們如何判斷一個變量是否是一個對象?

list_of_objects = function_returning_object_list() 
for object in list_of_objects: 
    do_something(object.param) 

不是object.get_param種奇怪地看到,如果你只是閱讀的代碼,不知道function_returning_object_list()實際執行返回對象列表?沒有可變類型的輸入,你如何通過命名約定來避免這種混淆?

希望我很清楚。

+1

您可以隨時檢查它的類型,例如,用'type()'。但總的來說,一個對象的類型應該在寫得很好的代碼中非常清晰,並且通常會被函數名稱隱含。 – Natecat

回答

3

這可能主要是一個基於意見的問題,但我會嘗試一個答案。

良好的變量名稱總是幫助不管語言。如果你有一個名字的函數,比如get_data,那麼如果這個數據是一個單獨的對象或者一個列表或者什麼的話,那麼你就不能真正推斷出這個數據。但是,如果您有class Bunny和某個名稱爲get_bunnies的函數,則可以安全地假設它會返回某種集合。當然總是存在一個問題,例如收集是否爲listdict

但是,如果你只是閱讀這樣的代碼,你可以很快推斷出,如果它與關鍵字一起使用,它是一個dict或它的一些衍生物。

Duck Typing的用途簡而言之就是「如果它像鴨子一樣走路,像鴨子一樣游泳,像鴨子一樣跳,,那麼它可能是一隻鴨子。這意味着,即使get_bunnies回報dict一些奇特的子類,你應該能夠使用它像它實際上是一個dict,只要它實現了正確的__dunder__ - 方法。

鴨打字總是當然引發了一些問題,強類型不對,但通常只是一個約定的事情。如果您不確定某個函數會返回什麼,您可以隨時對其進行測試:在代碼中,在解釋器中甚至查找源代碼。

關於命名變量的「匈牙利符號」,如strNamename_string ......我一直同意羅伯特·C·馬丁的觀點,認爲它給變量名帶來不必要的冗餘。當然,對於動態輸入來說,冗餘並不是那麼糟糕,但即便如此,我也不喜歡它。在閱讀代碼並搜索代碼時,它往往會讓事情變得更加困難。或者甚至更多,當變量類型改變而不改變名稱時...

如果你既沒有示例代碼可用,也沒有好的命名,你需要查找源代碼,或者希望有一個包含在函數定義中的docstring。如果運氣好,文檔字符串定義爲並且最新的日期爲,那麼一個好的IDE將會幫助您解析該字符串,甚至是函數的整個定義,而無需自己查找源文件。

+0

這是我正在尋找的答案,或多或少。謝謝。 – frei

0

那麼,Python中的一切確實是一個對象。如果每個返回的對象具有param屬性,則這裏適當的問題是。

In [17]: a = 1 

In [18]: type(a) 
Out[18]: int 

In [19]: b = 'b' 

In [20]: type(b) 
Out[20]: str 

In [21]: c = True 

In [22]: type(c) 
Out[22]: bool 

如果你看一下上面的例子中,你會看到他們正在str類型,intbool的對象。問題是這些都沒有param屬性。

+0

我想我在想什麼是否象徵性地引用一個對象的類型是一個好主意或不是。例如,如何區分'wow_string = str('wow')'或'wow_string = CustomStringClass('wow')',或者這些是否是好符號。 – frei

+0

您可以使用'isinstance'來檢查對象所屬的這兩個類中的哪一個。 – Fejs

+0

如果這是您的問題,匈牙利語符號被認爲是非常和諧的。 –

相關問題