请问:sodier应该继承了gun的所有属性和方法。但是报错说sodier没有gun的子弹数num属性是为什么呢?

class Gun(object):
def init(self, name, num):
self.name = name
self.num = num
__snum = num

def __str__(self):
    return "枪:%s" % self.name

def biubiu(self):
    if self.num > 0:  # 子弹足够
        self.num -= 1  # 子弹发射
        print("开火!biubiu~")
    else:
        print("咔咔,没子弹了")

class Fire_soldier(Gun):
def init(self, name):
self.name = name

def __str__(self):
    return "特种兵:%s" % self.name

def fire(self):
    print("%s按下扳机" % self.name)
    super(Fire_soldier, self).biubiu()

def relod(self):
    super().num += super().__snum

gun = Gun("沙漠之鹰", 7)
soldier = Fire_soldier("战狼")

soldier.fire()

print(Fire_soldier.mro)class Gun(object):

def __init__(self, name, num):
    self.name = name
    self.num = num
    __snum = num

def __str__(self):
    return "枪:%s" % self.name

def biubiu(self):
    if self.num > 0:  # 子弹足够
        self.num -= 1  # 子弹发射
        print("开火!biubiu~")
    else:
        print("咔咔,没子弹了")

class Fire_soldier(Gun):
def init(self, name):
self.name = name

def __str__(self):
    return "特种兵:%s" % self.name

def fire(self):
    print("%s按下扳机" % self.name)
    super(Fire_soldier, self).biubiu()

def relod(self):
    super().num += super().__snum

gun = Gun("沙漠之鹰", 7)
soldier = Fire_soldier("战狼")

soldier.fire()

print(Fire_soldier.mro)

img

你需要在class Fire_soldier的 __init__(): 中用  super().__init__(name,num) 调用父类的构造函数

你题目的解答代码如下:

class Gun(object):
    def __init__(self, name, num):
        self.name = name
        self.num = num
        __snum = num

    def __str__(self):
        return "枪:%s" % self.name

    def biubiu(self):
        if self.num > 0:  # 子弹足够
            self.num -= 1  # 子弹发射
            print("开火!biubiu~")
        else:
            print("咔咔,没子弹了")
class Fire_soldier(Gun):
    def __init__(self, name,num):
        super().__init__(name,num)    #调用父类的构造函数
        self.name = name

    def __str__(self):
        return "特种兵:%s" % self.name

    def fire(self):
        print("%s按下扳机" % self.name)
        super(Fire_soldier, self).biubiu()

    def relod(self):
        super().num += super().__snum
gun = Gun("沙漠之鹰", 7)
soldier = Fire_soldier("战狼",7)

soldier.fire()

print(Fire_soldier.mro)

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img

Fire_soldier的类中初始化函数没有调用父类Gun,所以没有属性num,至少应该像下面这样写:

class Fire_soldier(Gun):
    def __init__(self, name, num):
        super().__init__(name, num)

但是由于Fire_soldier没有其他的属性,所以__init__函数也可以省去不写,这样创建实例的时候,自动调用父类Gun的初始化函数。
此外,Fire_soldier继承Gun有点不合逻辑,感觉两者更应该是从属关系:Fire_soldier拥有Gun,而不是继承。所以也可以像下面这样写:

class Gun(object):
    def __init__(self, name, num):
        self.name = name
        self.num = num
        self.snum = num

    def __str__(self):
        return "枪:%s" % self.name
    
    def biubiu(self):
        if self.num > 0:  # 子弹足够
            self.num -= 1  # 子弹发射
            print("开火!biubiu~")
        else:
            print("咔咔,没子弹了")
class Fire_soldier():
    def __init__(self, name, gun):
        self.name = name
        self.gun = gun

    def __str__(self):
        return "特种兵:%s" % self.name
    
    def fire(self):
        print("%s按下扳机" % self.name)
        self.gun.biubiu()
    
    def relod(self):
        self.gun.num += self.gun.snum


gun = Gun("沙漠之鹰", 7)
soldier = Fire_soldier("战狼", gun)

soldier.fire()