2013-10-23 48 views
2

我在Python 3的開發,我有我的階級色彩的參數的方法,但是當 我嘗試使用方法:如何在Python中修復錯誤類型的對象?

def __init__(self, name, color=Color.Color("none"), style="solid", width="1px"): 
    self.__name = name 
    self.__style = style 
    self.__width = width 
    if color.get_name() == "none": 
     color.color_by_name('Black') 

這是錯誤:

File ................, line 10, in __init__ 
if color.get_name() == "none": 
AttributeError: 'str' object has no attribute 'get_name' 
+0

似乎'Color.Color()'不是一個類,而是一個返回字符串的方法。我對嗎? – aIKid

+1

你可以請你出示你的Color類嗎? – aIKid

+2

追溯的其餘部分是什麼?出於某種原因,'color'是一個字符串。也許默認值是一個字符串,或者在某些特定情況下傳遞的參數是一個字符串。 – delnan

回答

0

可能是由錯誤數據導致的此錯誤傳遞。

爲了避免這種情況您可以檢查傳遞的參數。

如果你的代碼依賴於精確的類實例您應該檢查傳入的參數是否是這個類的一個實例:

assert isinstance(color, Color), "color should be an instance of Color" 

如果你不關心實例類,但要確保這個實例有屬性get_color檢查實例是否具有屬性

if not hasattr(color, 'get_color'): 
    color=Color.Color("none") 
if color.get_name() == "none": 
    color.color_by_name('Black') 
+0

這並不回答這個問題。這只是一個解決問題的建議。 – aIKid

+0

問題是:「如何修復Python中錯誤類型的對象?」這將修復錯誤類型的對象問題 – oleg

+0

這也不能解決將對象作爲默認值傳遞的問題。 –

0

None對此很好時,您正在使用錯誤的哨兵值。嘗試:

def __init__(self, name, color=None, style="solid", width="1px"): 
    self.__name = name 
    self.__style = style 
    self.__width = width 
    if color is None: 
     self.color = "Black" 
    else 
     self.color = color 

但是,類屬性之間存在混淆,只能通過顯示完整的類來清除。奇數位有一個具有其自己類型的實例作爲屬性的類。

除非您確實需要,否則不應使用雙下劃線屬性名稱,如__width。許多Python新手認爲「這是模擬private成員」的方式,當語言真的不提供私有存儲類時。

2

聽起來像是要接受Color對象或字符串。你可以迴避型,或明確檢查:

鴨式:

def __init__(self, name, color=Color.Color("Black"), style="solid", width="1px"): 
    # Note: Changed default to 'Black', since there is no color 'none' 
    # This makes it a lot simpler. 
    self.__name = name 
    self.__style = style 
    self.__width = width 
    try: 
     color.get_name() 
    except AttributeError: 
     color = Color.Color(color) 

明確檢查:

def __init__(self, name, color=Color.Color("Black"), style="solid", width="1px"): 
    self.__name = name 
    self.__style = style 
    self.__width = width 
    if not isinstance(color, Color.Color): 
     color = Color.Color(color) 

兩種方法都可行;哪一個更容易取決於您的支票的確切程度(即您是否有其他需要單獨進行isinstance檢查的顏色類?是否有方便的鴨型檢查來捕獲所有失敗)。

+1

你應該更清楚你在捕捉的東西。在這裏它會是'除了AttributeError'之外,因爲你不想忽略get_name函數中的其他錯誤(比如數據庫搜索錯誤或其他) – RodericDay

相關問題