我正在使用Python进行OOP,并且正在尝试找出一些与继承相关的东西。 。我这里有一些具有一些类的代码。名为铁匠的类的行为符合预期,而名为Hero的类则试图从中调用函数,但我收到了意外的输出。
class Character(object):
def __init__(self,name):
self.health=100
self.name = name
# self.player = player
def printName(self):
print self.name
#def printPlayerName(self):
# print self.player
class Blacksmith(Character):
def __init__(self,name, forgeName):
super(Blacksmith, self).__init__(name)
#self.name = "Billy"
self.forge = Forge(forgeName)
class Hero(Character):
playerName = "Player"
def __init__(self,name):
super(Hero, self).__init__(name)
def setplayername(self,inputplayername):
playerName = inputplayername
class Forge:
def __init__(self,forgeName):
self.name = forgeName
bs = Blacksmith("Billy", "Billy's Forge")
print bs.health
bs.printName()
print bs.forge.name
player1 = Hero("Methos")
print player1.name
player1.setplayername("Chris")
#print playher1.playerName
print player1.playerName
输出为:
raina@DESKTOP-291MTC0 ~/python
$ python learningoopclasses01.py
100
Billy
Billy's Forge
Methos
Player
谁能解释为什么此输出显示“ Player”而不是“ Chris”。我还有一个问题,就是我不确定 init 方法的工作方式。在这些情况下,super会做什么?用名称值调用init到底能做什么?谢谢。
答案 0 :(得分:2)
__init__
。通过这种方法,我们还将使用self
变量来表示对象本身的实例。必须在Python中明确声明才能在对象上定义。
例如,
class Student():
def __init__(self, score1, score2, score3):
self.scores = [score1, score2, score3]
如果要为学生1分配分数,则只需要使用,因为stu_1
已经具有score
作为属性:
stu_1 = Student(80, 90, 85)
此外,__init__
还将根据设置的内容错误地通知您。
super()
用于首先调用Blacksmith
的父类(Character
),并允许您访问Character
的属性。
答案 1 :(得分:0)
铁匠的super()
方法中对__init__
的调用等于其超类,在本例中为Character。
您也可以将super(Blacksmith, self).__init__(name)
替换为Character.__init__(self, name)
。两者是等效的。
答案 2 :(得分:0)
对
略有调整def setplayername(self,inputplayername):
self.playerName = inputplayername
如果您不想更改其他任何内容,则可以在Hero
类中进行修复。