অ্যালেক্সমার্টেলির এবং ক্যাটসকুলের উত্তরগুলি অনুসরণ করার জন্য , কিছু সত্যই সহজ কিন্তু দুষ্টু মামলা রয়েছে যা reload
কমপক্ষে পাইথন ২-এ বিভ্রান্ত হওয়ার মতো ঘটেছে।
ধরুন আমার কাছে নিম্নলিখিত উত্স গাছ রয়েছে:
- foo
- __init__.py
- bar.py
নিম্নলিখিত বিষয়বস্তু সহ:
init.py:
from bar import Bar, Quux
বার.পি:
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
"। আমি সেই প্রভাবটিতে একটি সম্পাদনা যুক্ত করছি।