我有一些Python類,如果簡化的,看起來像:Python - 類型檢查確定何時不會拋出錯誤?
class base:
def __init__(self, v):
self.value = v
def doThings(self):
print "Doing things."
def doMoreThings(self):
print "Doing more things."
def combine(self, b):
self.value += b.value
class foo(base):
def showValue(self):
print "foo value is %d." % self.value
class bar(base):
def showValue(self):
print "bar value is %d." % self.value
的base
類包含實現兩者共同的foo
和bar
子類的功能的方法(由doThings
和doMoreThings
以上表示)。 foo
和bar
子類主要區別在於它們如何解釋value
字段。 (以上,它們只是在打印時顯示的內容不同,但在我的實際應用中,它們做了其他一些更復雜的事情。)base
可以被認爲是「抽象的」:用戶只能使用foo
s和bar
秒。 base
只存在於其子類通用的代碼中。
我想問的方法是combine
,它可以讓你拿兩個這樣的對象,再做第三個。由於foo
和bar
解釋value
不同,它沒有任何意義的不同類型的combine
兩個子類:可以 s到獲得foo
或兩個bar
s到獲得bar
但不是foo
和bar
。即使如此,combine
的程序對於所有子類都是相同的,所以將它分解並定義在一個地方是有意義的。
如果用戶試圖combine
兩個不兼容的對象,我可能會想要發出一個錯誤信號,但我沒有看到一種方法來做到這一點,而不會引入醜陋的類型檢測。這是否是一個好習慣?或者我應該做平常的事情,而不是檢查,記錄問題,並假定用戶不會嘗試以非意圖的方式使用combine
,儘管這樣的使用似乎「成功」並返回垃圾對象而不是提出錯誤?
謝謝你的幫助。
比較'__class ______ name__'是恕我直言很醜陋。更好的方法是比較'type(self)== type(b)'或者使用'isinstance(b,type(self))''。 – glglgl 2013-05-10 07:38:34
@glglgl''type(self)== type(b)''總是爲true,因爲它們都是''instance''。 ''isinstance''也有同樣的問題。同意它的醜陋,但... – Vorsprung 2013-05-10 07:46:15
哎唷!沒有看到OP使用舊式課程......那麼很明顯。 (我儘量避免使用它們。)但是使用'isinstance'時,它應該也適用於舊式的類(剛測試過)。 – glglgl 2013-05-10 08:29:25