2013-05-28 21 views
-1
class ParamMeta(type): 
    def __str__(self): 
    return self.__name__ 


class Param(object): 
    __metaclass__=ParamMeta 

class SomeParam(Param): 
    pass 

我要的是:型功能

type(SomeParam)==Param 

如何實現這一目標?

更新:我需要更改以獲得所需的行爲?

更新2:對於後代:這個問題是完全徹底的假。請假裝你沒有看到它;)

+2

你想用這個做什麼,你的用例是什麼? **爲什麼** type(SomeParam)'需要成爲基類,而不是'ParamMeta'元類型?如果有*多個*基類會發生什麼? –

+0

我希望能夠擁有簡單明確的陳述陳述,例如斷言類型(SomeParam)==參數 – jldupont

+2

不,這不是一個用例。這不是破壞Python類和類型系統的理由。最重要的是,這根本不是理由。 –

回答

6

SomeParam類對象的類型不是Param,它的ParamMetatype()正確地報告。你在混淆is-a和繼承關係。 A SomeParam實例 is-a ParamSomeParam類對象,另一方面,Param類繼承類對象,但它不是值類型Param

對於子類關係,有內建issubclass(),這是isinstance類似於is-a關係:issubclass(SomeParam, Param)是正確的。

編輯:有什麼可以做,以實現type(SomeParam)返回Param,當然除了與返回基類(這將是非常誤導和不良作風)手寫功能遮蔽名稱type

+0

正是我的答案試圖解決,但得到了downvoted。 :-) –

+0

請重新閱讀這個問題:我想要一個解決方案,以便'輸入(SomeParam)== Param'。我不需要解釋爲什麼這不起作用,如這裏所述。 – jldupont

+2

@jldupont這就像要求'print(x)'增加'x'一樣。這是錯誤的,沒有道理。你可以定義一個函數給你/超類,你可以測試某個東西是否是其他東西的子類,但是這兩個操作都與'type()'完全不同。 – delnan