簡體   English   中英

autoreload和package導致TypeError:super(type,obj):obj必須是類型的實例或子類型

[英]autoreload and package causing TypeError: super(type, obj): obj must be an instance or subtype of type

我有python代碼跨越幾個文件,為方便起見我打包,最后是my_package目錄下的以下3個文件:

__init__.py

內容:

from file1 import *
from file2 import *

file1.py內容:

class Base(object):
    pass

file2.py內容:

from file1 import Base 
class Derived(Base):
    def __init__(self):
        return super(Derived, self).__init__()

然后我在IPython中執行:

>>>%autoreload 2
>>>import my_package
>>>t = my_package.Derived()

到現在為止還挺好。 但后來我對file2.py進行了更改,比如說添加了一個虛擬屬性。 現在我執行時:

>>>t = my_package.Derived()
>>>      2 class Derived(Base):
>>>      3     def __init__(self):
>>>----> 4         return super(Derived, self).__init__()
>>>      5 
>>>      6 dumm = 'asdf'
>>>
>>>TypeError: super(type, obj): obj must be an instance or subtype of type

在我重新啟動IPython控制台之前,這不會消失。 為什么不自動重載正確處理? 如果我將Base和Derived放入單個模塊文件而不是包中,一切都有效。

我不是IPython的用戶,所以我不能確切地說出發生了什么,但我想這是在__init__.py文件中使用from file2 import *一個症狀。

當您使用package.Derived創建Derived類的實例時,您沒有獲得該類的最新版本,但是當首次加載包時出現的舊版本以及from file2 import *語句是跑。 當您修改模塊代碼並且IPython重新加載它時,更改了package.file2.Derived ,但沒有更改package.Derived

但是,該類的舊版本仍然具有對其模塊的命名空間的引用,並且當它試圖在super調用中按名稱查找自己時,它會找到該類的較新版本。 這就是您收到錯誤的原因,因為兩個Derived類不一樣。

如果您直接訪問package.file2.Derived則可能會避免此問題。 這將始終讓您進入該類的當前版本,該版本不應該與super調用有任何問題。 請注意,如果在修改模塊之前仍然存在該類的實例,則可能仍然存在問題(但這可能不是很令人驚訝)。

在Python 3中,使用新的super().__init__()而不是super(Derived, self).__init__()解決了我的問題

暫無
暫無

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

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