Python 使用安装到父类的模块的方法

Python 使用安装到父类的模块的方法,python,inheritance,methods,Python,Inheritance,Methods,我有一个具有类层次结构的项目:Unit您不能使用在不同模块中导入的名称,即使这是父模块的名称空间 只需直接导入所需的名称;e、 g.再次为具有Necromancer类的模块导入Observable 导入有两件事: 如果以前没有加载模块,它将加载该模块。 它将命名空间中的引用添加到导入的对象。 在两个不同的位置导入同一模块意味着只加载一次,但在您的情况下,您确实希望在包含Necromancer类的模块中创建对可观察类的额外引用。您需要从Observer导入。请在定义Necromancer的脚本中观

我有一个具有类层次结构的项目:Unit您不能使用在不同模块中导入的名称,即使这是父模块的名称空间

只需直接导入所需的名称;e、 g.再次为具有Necromancer类的模块导入Observable

导入有两件事:

如果以前没有加载模块,它将加载该模块。 它将命名空间中的引用添加到导入的对象。
在两个不同的位置导入同一模块意味着只加载一次,但在您的情况下,您确实希望在包含Necromancer类的模块中创建对可观察类的额外引用。

您需要从Observer导入。请在定义Necromancer的脚本中观察导入Observer,如果您想直接访问它。另外,请注意,您可以从foo导入栏baz。您的意思是我需要导入两次模块?@ovod:是的。这并不像听起来那么糟糕,Python对此进行了优化。另外,请考虑另一种选择——在每个级别导入到每个命名空间中的每个名称在当前命名空间中都是可用的。冲突和混乱的可能性将是巨大的。
from Point import Point
from Observer.Observe import Observerable
from Observer.Observe import Observer
import Excep

import sys

class Unit(object):
    # __slots__ = ['_x', '_y']

    def __init__(self, name, hitpoints, damage, armor=0, location=Point(0, 0)):
        self._name = name
        self._hitpoints = hitpoints
        self._damage = damage
        self._hitpointslimit = hitpoints
        self._armor = armor
        self._location = location

    def ensureisalive(self):
        if self._hitpoints == 0:
            raise UnitIsDeadException()
    blablabla
from SpellCasters.SpellCaster import SpellCaster
from Units.Point import Point
from Spells.FireBall import FireBall

class Necromancer(SpellCaster):

    def __init__(self, name, hp, dmg, armor, location, mana):
        super(Necromancer, self).__init__(name, hp, dmg, armor, location, mana)
        self._spell = FireBall()

    def cast(self, target):
        Observer.addobservable(target) # problem is here
        super(Necromancer, self).manaspend(self._spell.cost)
        self._spell.action(target)


    def takedamage(self, dmg):
        super(SpellCaster, self).ensureisalive()
        if dmg > self._hitpoints:
            hitpoints = 0
            Observer.notify()
            return

        self._hitpoints -= dmg


    def __del__(self):
        pass