2012-12-18 22 views
1

例如,拿一個簡單的課代表一個人。唯一的類屬性是表示人名的字符串。我想確保沒有人試圖將構造函數的某些其他類型的對象(如int或list)等傳遞給它。這是我下面的第一次嘗試,我認爲如果參數不是str,但它似乎仍然返回Person obj,則會返回None類型的obj。我來自一個「更」強類型的語言背景,我有點困惑,因爲如何處理我在Python中的自我。 pythonic風格對這種情況以及類型安全有更多的一般性描述?我應該舉一個例外嗎?或者找到一種方法來返回None?或者完全是別的。什麼是pythonic方法來檢查構造函數參數的vaildity?

class Person: 

    name = None 

    def __init__(self, name): 
     if not isinstance(name, str): 
      return None 
     self.name = name 
+1

我基本上有一個類似的問題,有一天,你可以找到它[這裏](http://stackoverflow.com/questions/13919772/in-python-is-there-a-way-to-know-如果-AN-對象器具-AN-接口之前-I)。 **我敦促你閱讀Martijn Pieter的答案**,因爲它與你所問的內容非常相關。 – NlightNFotis

+0

爲什麼不使用'self.name = str(name)'?這將接受具有字符串表示的所有內容。 –

回答

5

你想要的__init__方法中引發錯誤:

if not isinstance(name,basestring): 
    raise TypeError("I don't think that is a name ...") 

*注意basestring還包括unicode爲python2.x,但不在python3.x可用。

儘管如此,在構建person之後,這裏沒有任何東西可以阻止用戶將該人的名字重新設置爲列表。

jack = Person("Jack") 
jack.name = ["cheese","steak"] #??? 

如果您想要內置此安全功能,您需要開始瞭解property

+0

錯誤的異常? –

+0

@JonClements - 是的,我想是的。好決定。 :) – mgilson

+0

OMG - 這太可怕了 - 我們都只是在同一時間:)(即str/basestring的東西) - 關於屬性的好點子,雖然+ 1 :) –

5

這就是它 - 短期使用某種形式的裝飾的,但通常,類型檢查不是很Python的,但在某些情況下有效,你的代碼應該是:

def __init__(self, name): 
    if not isinstance(name, basestring): 
     raise TypeError('name must be str/unicode') 
    # ... 

注意basestring是Python 2.x中strunicode的父項,所以這將允許兩者 - 使用str(因爲您現在在2.x中)不允許unicode(反之亦然 - 出於任何特定原因)。在3.x中,basestring不存在,您剛剛獲得str

+1

+1,提及「類型檢查通常不是Pythonic」 – mgilson

+0

+1 @ JonClements-謝謝! –

+0

@vanattab進一步閱讀,可能是有用的:http://stackoverflow.com/questions/1950386/is-it-pythonic-to-check-function-argument-types –

0

我不會在這裏返回None,而是引發異常來表示不正確的對象類型。

相關問題