python中的继承有问题
我在类之间的继承方面遇到了问题。我正在挣扎的类是秃鹫类,它是bird类的一个子类,bird类是critter类的一个子类。鸟类和动物类,以及它们正在运行的主要部分,都可以正常工作。但是当我尝试使用兀鹫类时,我得到了一个错误:python中的继承有问题,python,inheritance,Python,Inheritance,我在类之间的继承方面遇到了问题。我正在挣扎的类是秃鹫类,它是bird类的一个子类,bird类是critter类的一个子类。鸟类和动物类,以及它们正在运行的主要部分,都可以正常工作。但是当我尝试使用兀鹫类时,我得到了一个错误: AttributeError: 'Vulture' object has no attribute '_Bird__direction' 我不确定我做错了什么,我希望有人能帮我找到我的错误 秃鹫类: from bird import * class Vulture (Bi
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
开始,而不是两个。两个是神奇的,一个不是。这似乎让一切都正常工作了,感谢你们的帮助。