python中的继承有问题

python中的继承有问题,python,inheritance,Python,Inheritance,我在类之间的继承方面遇到了问题。我正在挣扎的类是秃鹫类,它是bird类的一个子类,bird类是critter类的一个子类。鸟类和动物类,以及它们正在运行的主要部分,都可以正常工作。但是当我尝试使用兀鹫类时,我得到了一个错误: AttributeError: 'Vulture' object has no attribute '_Bird__direction' 我不确定我做错了什么,我希望有人能帮我找到我的错误 秃鹫类: from bird import * class Vulture (Bi

我在类之间的继承方面遇到了问题。我正在挣扎的类是秃鹫类,它是bird类的一个子类,bird类是critter类的一个子类。鸟类和动物类,以及它们正在运行的主要部分,都可以正常工作。但是当我尝试使用兀鹫类时,我得到了一个错误:

AttributeError: 'Vulture' object has no attribute '_Bird__direction'
我不确定我做错了什么,我希望有人能帮我找到我的错误

秃鹫类:

from bird import *
class Vulture (Bird):
    def __init__(self):
        self.__hungry=True
        self.__in_a_row=-1
        self.__direction=DIRECTION_NORTH

    def eat(self):
        if self.__hungry:
            self.__hungry=False
            return True
        else:
            return False

    def fight(self, opponent):
        self.__hungry=True
        return super(Bird, self).fight(self,opponent)
    def get_color(self):
        black
鸟类种类:

from Critter import *

class Bird (Critter):
    def __init__(self):
        self.__in_a_row=-1 #doesn't go north 3 times on first move if set to 0
        self.__direction=DIRECTION_NORTH

    def fight(self, opponent):
        if opponent.__str__=="%":  #roars at ants
            return ATTACK_ROAR
        else:
            return ATTACK_POUNCE

    def get_color(self):
        return "blue" 

    def __str__(self): #uses the most recent direction to determine which character should be used
        if (self.__direction==DIRECTION_NORTH or self.__direction==DIRECTION_CENTER):
            return "^"
        elif self.__direction==DIRECTION_EAST:
            return ">"
        elif self.__direction==DIRECTION_SOUTH:
            return "V"
        else:
            return "<"

    def get_move(self):
        if self.__in_a_row<2:
            self.__in_a_row+=1
            return self.__direction
        else:   #Turning in the proper direction after it hits the end of the line
            if self.__direction==DIRECTION_NORTH:
                self.__direction=DIRECTION_EAST
                self.__in_a_row=0
                return self.__direction
            elif self.__direction==DIRECTION_EAST:
                self.__direction=DIRECTION_SOUTH
                self.__in_a_row=0
                return self.__direction
            elif self.__direction==DIRECTION_SOUTH:
                self.__direction=DIRECTION_WEST
                self.__in_a_row=0
                return self.__direction
            elif self.__direction==DIRECTION_WEST:
                self.__direction=DIRECTION_NORTH
                self.__in_a_row=0
                return self.__direction

    def eat(self):
        return False
从生物导入*
鸟类(生物)类:
定义初始化(自):
如果设置为0,self.\u in_a_row=-1#在第一次移动时不会向北移动3次
自身方向=北向
def战斗(自我、对手):
如果对手。uuu str_uuuu==“%”:#对蚂蚁吼叫
回击怒吼
其他:
回击
def get_颜色(自身):
返回“蓝色”
def uu str uu(self):#使用最近的方向来确定应该使用哪个字符
如果(自身方向==方向北或自身方向==方向中心):
返回“^”
elif self.\uuuuu方向==东方向:
返回“>”
elif self.\uuuuu方向==南方向:
返回“V”
其他:
return“请参阅Python文档中关于的这一节

Python特别处理以双下划线开头的实例变量,修改名称以使它们对类私有(甚至对父类私有)。在Vulture类上调用Bird方法时,Bird方法引用的是
self.\uu direction
实际上引用的是
self.\u Bird\uu direction
变量,该变量与在Vulture
构造函数中初始化的
self.\u Vulture\uu direction
变量不同

特别是:

v = Vulture()   # initializes self._Vulture__direction only
print(v)        # throws an exception -- v._Bird__direction isn't initialized
编辑:正如@ShadowRanger所指出的,Python中的惯例是在这些实例变量或方法的前面加一个下划线,这些变量或方法对于实现来说是私有的,但是在超类和子类之间可以自由共享(例如,类似于Java或C++中受保护的
)语言对这些变量没有特殊处理,它只是向类的用户发出一个信号,他们不应该“弄乱”这些实例变量或方法


这可能就是你想要的方向,一行,甚至可能是饥饿(虽然最后一个没有出现在鸟类类中)。如果您将所有这些双下划线前缀更改为单下划线,应该可以解决您的问题。

您可以提供使用这些类的代码以及
Critter
类吗?要解决这个问题,您可以提到与其他语言中的“protected”对应的变量(继承层次结构中的所有类都可以访问,但不供其他类使用)传统上是从一个
\uu
开始,而不是两个。两个是神奇的,一个不是。这似乎让一切都正常工作了,感谢你们的帮助。