Access Objects From Another Module
Solution 1:
Yes, you should definitely factor this out. What you tried is circular imports between your modules, and that can be very problematic. If combat
imports main
and main
imports combat
, then you may get an exception because main
will not have finished executing when combat
starts executing for the import. Assuming main
is your start up script, it should probably do nothing more than instantiate a class or call a method from another module. Avoid global variables, too. Even if it doesn't seem like they'll be a problem now, that can bite you in the behind later on.
That said, you can reference members of a module like so:
importcommonx= common.some_method_in_common()
y = common.SomeClass()
or
from common importSomeClassy= SomeClass()
Personally, I generally avoid referencing a method from another module without qualifying it with the module name, but this is also legal:
from common importsome_method_in_commonx= some_method_in_common()
I typically use from ... import ...
for classes, and I typically use the first form for methods. (Yes, this sometimes means I have specific class imports from a module in addition to importing the module itself.) But this is only my personal convention.
An alternate syntax of which is strongly discouraged is
from common import *
y = SomeClass()
This will import every member of common into the current scope that does not start with an underscore (_
). I the reason it's discouraged is because it makes understanding the source of the name and it makes breaking things too easy. Consider this pair of imports:
from common import *
from some_other_module import *
y = SomeClass()
Which module does SomeClass
come from? There's no way to tell other than to go look at the two modules. Worse, what if both modules define SomeClass
or SomeClass
is later added to some_other_module
?
Solution 2:
if you have imported main module in combat
module by using import main
, then you should use main.*(stuff that are implemented in main module) to access classes and methods in there.
example:
importmainperson= main.Person()
also you can use from main import *
or import Person
to avoid main.* in the previous.
There are some rules for importing modules as described in http://effbot.org/zone/import-confusion.htm :
import X
imports the module X, and creates a reference to that module in the current namespace. Or in other words, after you’ve run this statement, you can useX.name
to refer to things defined in module X.from X import *
imports the module X, and creates references in the current namespace to all public objects defined by that module (that is, everything that doesn’t have a name starting with “_”). Or in other words, after you’ve run this statement, you can simply use a plain name to refer to things defined in module X. But X itself is not defined, soX.name
doesn’t work. And if name was already defined, it is replaced by the new version. And if name in X is changed to point to some other object, your module won’t notice.from X import a, b, c
imports the module X, and creates references in the current namespace to the given objects. Or in other words, you can now usea
andb
andc
in your program.Finally,
X = __import__(‘X’)
works likeimport X
, with the difference that you1) pass the module name as a string, and
2) explicitly assign it to a variable in your current namespace.
Post a Comment for "Access Objects From Another Module"