簡體   English   中英

測試對象是另一個實例類型的子類

[英]Test an object is a subclass of the type of another instance

我有這個代碼:

class Item:
    def __init__(self,a):
        self.a=a

class Sub(Item):
    def __init__(self,a,b):
        self.b=b
        Item.__init__(self,a)

class SubSub(Sub):
    def __init__(self,a,b,c):
       self.c=c
       Sub.__init__(self,a,b)

obj1=Item(1)
obj2=Sub(1,2)
obj3=SubSub(1,2,3)

現在我想檢查obj2obj3是否是作為obj1子類的類的實例以及Item子類。

這是我的理解,我知道我可以使用isinstance()來查找obj2是否為Sub 我知道我可以使用issubclass(Sub, Item) 但是,讓我說我不知道obj2是什么類。

我嘗試使用issubclass(type(obj2),Item)但這不起作用,因為type()返回一個單獨的對象,我真的不了解它的工作原理。 這只是一個問題,雖然我認為這個問題的答案將幫助我解決我遇到的其他一些問題。

此外,我嘗試使用一些特殊屬性來執行此操作,例如__class__但我也無法弄清楚如何做到這一點。

您需要使用type()函數提取objtype()

isinstance(obj2, type(obj1))

請注意, 第二個參數是類,第一個是要測試的實例。 type()在這里返回實際的類對象,而不是任何單獨的對象

issubclass()適用於您的用例:

issubclass(type(obj2), Item)

演示:

>>> class Item:
...     def __init__(self,a):
...         self.a=a
... 
>>> class Sub(Item):
...     def __init__(self,a,b):
...         self.b=b
...         Item.__init__(self,a)
... 
>>> class SubSub(Sub):
...     def __init__(self,a,b,c):
...        self.c=c
...        Sub.__init__(self,a,b)
... 
>>> obj1=Item(1)
>>> obj2=Sub(1,2)
>>> obj3=SubSub(1,2,3)
>>> isinstance(obj2, type(obj1))
True
>>> issubclass(type(obj2), Item)
True

請注意,如果在此處重新定義了類,則不會更新現有實例以指向新的類對象。 如果type(obj2)不適合你,那么這意味着用於生成它的類與你現在測試的類不同。

您可以通過測試您的假設來測試是否是這種情況; 驗證類和實例是否仍然同步,例如:

>>> type(obj1) is Item
True
>>> type(obj2) is Sub
True
>>> type(obj3) is SubSub
True

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM