Chỉ cần theo dõi của AlexMartelli và Catskul của câu trả lời, có một số trường hợp thực sự đơn giản nhưng khó chịu xuất hiện lại gây bất ngờ reload
, ít nhất là trong Python 2.
Giả sử tôi có cây nguồn sau:
- foo
- __init__.py
- bar.py
với nội dung sau:
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)
Điều này hoạt động tốt mà không cần sử dụng reload
:
>>> from foo import Quux
Loading bar
>>> Quux()
Quux[0, x=43]
>>> Quux()
Quux[1, x=43]
>>> Quux()
Quux[2, x=43]
Nhưng hãy thử tải lại và nó không có tác dụng hoặc làm hỏng mọi thứ:
>>> 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
Cách duy nhất tôi có thể đảm bảo bar
mô-đun con được tải lại là reload(foo.bar)
; cách duy nhất để tôi truy cập vào Quux
lớp được tải lại là truy cập và lấy nó từ mô-đun con được tải lại; nhưng foo
bản thân mô-đun vẫn giữ Quux
đối tượng lớp ban đầu , có lẽ là vì nó sử dụng from bar import Bar, Quux
(thay vì import bar
theo sau Quux = bar.Quux
); hơn nữa Quux
lớp học không đồng bộ với chính nó, điều này thật kỳ lạ.
... possible ... import a component Y from module X
" vs "question is ... importing a class or function X from a module Y
". Tôi đang thêm một chỉnh sửa cho hiệu ứng đó.