सिर्फ एलेक्समार्टेली के और कैट्सकुल के जवाबों का पालन करने के लिए , वास्तव में कुछ सरल लेकिन बुरे मामले हैं जो reload
कम से कम पाइथन 2 में भ्रमित होते हैं ।
मान लीजिए कि मेरे पास निम्नलिखित स्रोत वृक्ष हैं:
- foo
- __init__.py
- bar.py
निम्नलिखित सामग्री के साथ:
init.py:
from bar import Bar, Quux
bar.py:
print "Loading bar"
class Bar(object):
@property
def x(self):
return 42
class Quux(Bar):
object_count = 0
def __init__(self):
self.count = self.object_count
self.__class__.object_count += 1
@property
def x(self):
return super(Quux,self).x + 1
def __repr__(self):
return 'Quux[%d, x=%d]' % (self.count, self.x)
यह उपयोग किए बिना ठीक काम करता है reload
:
>>> from foo import Quux
Loading bar
>>> Quux()
Quux[0, x=43]
>>> Quux()
Quux[1, x=43]
>>> Quux()
Quux[2, x=43]
लेकिन पुनः लोड करने का प्रयास करें और इसका कोई प्रभाव नहीं पड़ता है या चीजों को नष्ट नहीं करता है:
>>> import foo
Loading bar
>>> from foo import Quux
>>> Quux()
Quux[0, x=43]
>>> Quux()
Quux[1, x=43]
>>> reload(foo)
<module 'foo' from 'foo\__init__.pyc'>
>>> Quux()
Quux[2, x=43]
>>> from foo import Quux
>>> Quux()
Quux[3, x=43]
>>> reload(foo.bar)
Loading bar
<module 'foo.bar' from 'foo\bar.pyc'>
>>> Quux()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "foo\bar.py", line 17, in __repr__
return 'Quux[%d, x=%d]' % (self.count, self.x)
File "foo\bar.py", line 15, in x
return super(Quux,self).x + 1
TypeError: super(type, obj): obj must be an instance or subtype of type
>>> Quux().count
5
>>> Quux().count
6
>>> Quux = foo.bar.Quux
>>> Quux()
Quux[0, x=43]
>>> foo.Quux()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "foo\bar.py", line 17, in __repr__
return 'Quux[%d, x=%d]' % (self.count, self.x)
File "foo\bar.py", line 15, in x
return super(Quux,self).x + 1
TypeError: super(type, obj): obj must be an instance or subtype of type
>>> foo.Quux().count
8
एकमात्र तरीका जिससे मैं यह सुनिश्चित कर सका कि bar
सबमॉड्यूल को फिर से लोड किया गया था reload(foo.bar)
; जिस तरह से मैं फिर से लोड किए गए Quux
वर्ग तक पहुंचता हूं, उसे फिर से लोड किए गए उप मॉड्यूल से पहुंचना और पकड़ना है; लेकिन foo
मॉड्यूल खुद को मूल Quux
वर्ग ऑब्जेक्ट पर रखता था , संभवतः क्योंकि यह उपयोग करता है from bar import Bar, Quux
(बजाय import bar
इसके बाद Quux = bar.Quux
); इसके अलावा Quux
वर्ग खुद के साथ सिंक से बाहर हो गया, जो कि सिर्फ विचित्र है।
... possible ... import a component Y from module X
" बनाम "question is ... importing a class or function X from a module Y
"। मैं उस प्रभाव को संपादित कर रहा हूं।