我正在開發一個Python應用程序,我需要多次檢查一個對象是否是DB模型的子類。如果第一個參數不是類,issubclass會引發異常
我做了我自己的函數來做到這一點:
def isModel(obj):
return isinstance(obj, type) and issubclass(obj, Model)
issubclass
引發obj的例外是不是一個班,但我想它只是返回false,如果obj
是不是一類。
我想更好地使另一個函數,而不是使用內置的issubclass
:
def _issubclass(obj, Klass):
return isinstance(obj, type) and issubclass(obj, Klass)
但爲什麼內置issubclass
沒有這樣做?什麼原因?我錯過了什麼嗎?
UPDATE:
我有型號:
class BaseModel(object):
id = Field(...)
class MyModel(BaseModel):
deleted = Field(...)
在我想要檢查的功能,如果一個參數是一個BaseModel
:
def update_model(model):
assert isinstance(model, type) and issubclass(model, BaseModel), 'Must be a model'
issubclass
回答的問題如果一個對象是一個子類給定的班級。如果對象是一個類實例,那麼答案IMO應該是'不,你的對象不是一個BaseModel子類,因爲它根本不是一個類'。
在Python是很正常的,而不是if something is not None or len(something) != 0
使用if something
而不是任何TypeError
。如果issubclass
的第一個參數不是類,那麼引發TypeError有什麼用處?
例如,有人問一隻狗:'你是否是正確的人來解決這個任務?',而不是回答'不',狗說'我不是男人'。我問某人一件事(是子類),他沒有回答我的問題。
引發'TypeError'對我來說似乎是一件非常自然的事......它鼓勵正確地做事。你試圖給'issubclass'壞數據;就像'float('foo')'會引發一個ValueError而不是像在某些語言中那樣返回'float'('nan')',這只是Python的做事方式。如果你使用的是靜態類型的語言,它通常會在編譯時窒息。 – 2012-01-01 09:32:47