[英]Python - TypeError: super(type, obj): obj must be an instance or subtype of type?
[英]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.