我目前正在複製類似於這個問題的東西:python switch by class name?鴨打字和異物
我有一個for循環,在一組對象進行迭代,並且對它們進行分類,按類型,分成幾個列表中的一個。
for obj in list_of_things:
if isinstance(obj, Class1):
class1list.append(obj)
if isinstance(obj, Class2):
class2list.append(obj)
等幾個其他類。應用程序就像一個ORM - 每個類的數據將被提取並寫入數據庫,並且每個類都有不同的數據提取。此外,有必要在Class2的任何實例之前由ORM處理Class1的所有實例。最後,Class1和Class2不是我的 - 它們是我使用的API的輸出,所以我沒有能力像上一個問題中提到的那樣改變它們(比如,編寫一個serialize()方法來轉儲我在每個類中需要的數據)。我向API提出了一些對象的請求,並且使我得到了各種類型的對象,每個對象都需要提取不同的數據。
有沒有更pythonic這樣做?這種方法滿足需要,但它傷害了我的眼睛,我想學習更好的方法。我對Python仍然很陌生。
我想到了這一點,但我的理解是,類型()不尊重子的關係,所以如果第3第三方API子類Class1但我想將這些子類作爲Class1的實例對待,它將無法執行。現在,我碰巧知道沒有我會得到的子類,但是我認爲使用type()和isinstance()可以改變結果嗎? –
@JustinPalpant你是對的,子類*將被添加到不同的鍵下。你可以用'type(obj).__ bases__'做一些反省,但我只能看到變得越來越難看。然而,如果在不同的鍵下添加子類實例是可以接受的,你總是可以使用'issubclass()' – jedwards
來提取給定類及其子類的實例。我不知道有關'issubclass()',它聽起來像它可以填充最後的利基。我同意'type(obj).__ bases__'似乎可能會變得混亂。我打算將其標記爲已接受。 –