用inheritan传递变量

2024-05-14 03:43:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个选课程序来练习OOP

    # let's make a character selection program

    class player:
      def __init__(self, username, age, weight, height, gender):
        self.username = username
        self.age = age
        self.weight = weight
        self.height = height
        self.gender = gender

    class soldier(player):
      strength = weight*height*2
      print strength

    print "Please enter the following"

    player_username = raw_input("Please enter a username: ")
    player_age = input("Please enter your age: ")
    player_weight = input("Please enter your weight: ")
    player_height = input("Please enter your height: ")
    player_gender  = raw_input("Please enter your gender: ")
    player_character_class = raw_input("Please enter a player class: ")

    character_obj = player(player_username, player_age, player_weight, player_height, player_gender)
    print soldier.strength

但是,我得到了错误

    Traceback (most recent call last):
      File "character_select.py", line 11, in <module>
        class soldier(player):
      File "character_select.py", line 12, in soldier
        strength = weight*height*2
    NameError: name 'weight' is not defined

不太清楚体重是怎么定义的。我想我是通过把“player”转换成“solder”来继承的。有人能帮我吗?你知道吗

谢谢你!你知道吗


Tags: selfinputageyourusernamegenderstrengthclass
3条回答

我冒昧地纠正了代码中的一些错误/误解-看看这是否有用:

# let's make a character selection program

class Player:
    def __init__(self, username, age, weight, height, gender):
        self.username = username
        self.age = age
        self.weight = weight
        self.height = height
        self.gender = gender

class Soldier(Player):
    def __init__(self, *args):
#       First of all, in order to actually inherit the attributes of "player", you need to invoke the __init__ function for "player":
        Player.__init__(self, *args)  # The *args business is to send any arguments that can be handled by the generic player constructor to that player constructor.
#       You probably want to work on the instance variable "strength", so use self.strength, self.weight, and self.height
        self.strength = self.weight*self.height*2
#        print strength

print "Please enter the following"

player_username = raw_input("Please enter a username: ")
player_age = input("Please enter your age: ")
player_weight = input("Please enter your weight: ")
player_height = input("Please enter your height: ")
player_gender  = raw_input("Please enter your gender: ")
player_character_class = raw_input("Please enter a player class: ")

# I'm guessing you actually wanted to make the player a "soldier", not a generic "player"
character_obj = Soldier(player_username, player_age, player_weight, player_height, player_gender)
print character_obj.strength

以下是输出:

Please enter the following
Please enter a username: Brionius
Please enter your age: 92
Please enter your weight: 50
Please enter your height: 7
Please enter your gender: yes
Please enter a player class: super soldier
700

因为在__init__()中为player分配属性,所以在player实例化之前不会创建属性。但是,在soldier类中,您试图在类创建时基于当时不存在的变量来设置属性,因为它们只存在于实例(不同类的实例,而不是更少的实例)。你知道吗

我认为您可能想做的是为soldier编写一个__init__()方法。(我还冒昧地按照政治公众人物第8章将你们的班级名称大写。这有助于跟踪哪些名称引用类,即用于构造对象的模板,以及哪些名称引用类的实例。)

class Soldier(Player):
    def __init__(self, username, age, weight, height, gender):
        # call parent class to set up the standard player attributes
        Player.__init__(self, username, age, weight, height, gender)
        # now also define a soldier-specific attribute
        self.strength = weight*height*2

然后实例化Soldier类而不是Player类,因为您需要一个士兵:

character_obj = Soldier(player_username, player_age, player_weight, player_height, player_gender)
print character_obj.strength

我要进一步指出:

class Soldier(Player):

不是函数调用。您没有将Player传递给Soldier。相反,你说Soldier是一种类型的Player。因此,它具有Player的所有属性和功能(您无需再次指定,这就是整个继承点)以及您在Soldier中定义的任何其他属性和功能。但是,在声明Soldier时,您不能直接访问Player(或Player实例)的属性(通常不需要它们)。你知道吗

士兵是一个类,但你还没有实例化它。你试过实例化一个玩家,用字符\u obj,但是当你尝试打印士兵.xxx它看的是类,不是任何对象。你知道吗

相关问题 更多 >