使用Python中的OOP来解决问题

时间:2018-07-29 19:44:19

标签: python function class oop

我正在使用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到底能做什么?谢谢。

3 个答案:

答案 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类中进行修复。