【问题标题】:How do I use Class Attributes, Arguments and "self." effectively in Python?如何使用类属性、参数和“自我”。在 Python 中有效吗?
【发布时间】:2017-04-06 18:56:10
【问题描述】:

我正在创建一个基于文本的冒险游戏(如 this 帖子中提到的),我被困在如何使用类及其属性、与类相关的参数以及预定义关键字 self. 上。我四处寻找如何使用它们,但无济于事。我将分别举一个例子,并附上一个问题:

class Player:
    def __init__(self, name):
        self.name = name
        self.maxhealth = 100
        self.health = self.maxhealth
        self.attack = 15
        self.money = 0

    def display(self, name):
    print("Name:",self.name,"\nHealth:",self.health,"/",self.maxhealth,"\nAttack Damage:",self.attack,"\nMoney:",self.money)

答案中有人建议将self.name = name 更改为self.name = None,但他们没有解释为什么或如何帮助。如果有人能告诉我如何以正确或最有效的方式定义self.name,请执行。我也想知道如何在后面的函数中调用它。

我对类属性的工作方式(与上一个问题相关)以及您如何知道它们是否已启用以及如何调用它们感到困惑。

我也不确定class Player(#here): 中的参数以及如何使用它们。我不确定它是否有任何用途,但我看到人们这样做 (object)(Edum #or something like that) 我不知道他们添加了什么,如何调用它们等等。

import time
import random
import sys
import pickle

class Zombie:
    def __init__(self, name):
        self.name = name
        self.maxhealth = 50
        self.health = self.maxhealth
        self.attack = 5
        self.golddrop = random.randint(5,10)

class Skeleton:
    def __init__(self, name):
        self.name = name
        self.maxhealth = 75
        self.health = self.maxhealth
        self.attack = random.randint(5,10)
        self.golddrop = random.randint(5,10)


class Friend:
    def __init__(self, name):
        self.name = name
        self.maxhealth = 100
        self.health = self.maxhealth
        self.attack = random.randint(7,10)


class DungeonBoss:
    def __init__(self, name):
        self.name = name
        self.maxhealth = 150
        self.health = self.maxhealth
        self.attack = random.randint(15, 25)

这些是我想要在我的游戏中使用的课程。我想知道我是否可以创建一个仅称为“敌人”的类,然后也许可以创建可以从该类调用的子集/类(再一次,任何有关如何从类调用属性的帮助将不胜感激),所以它使代码更干净。

如果您不确定我刚才所说的任何内容,或者您​​需要对问题进行更多说明,请发表评论。提前谢谢你。

【问题讨论】:

  • 到目前为止,您做得很好,但您真正需要的是一个简短的课程,其中包含课程教程。 Stack Overflow 不适合这样的普通教育。只需搜索“Python 类教程”并完成对概念的解释。有关此处要问的问题的指导,请参阅 on topichow to ask
  • 另外,如果您不确定如何使用这些东西,那么您不应该在此处发布这么多代码。给自己写一个简短的游戏,一次写几行:一个玩家,一个怪物,一场战斗。当你开始工作时,我希望你会向我们提出一些很好的、有针对性的问题。
  • 好的,我会这样做的。当我启动并运行短游戏时,我会再次发帖(可能会删除这篇文章)询问是否有办法改进代码并使其更高效。我已经在 codereview.stackexchange.com here 上发布了一个使用类的游戏,而我的类的一些答案并没有真正意义,这就是我来这里的原因。
  • 明白。然而,正如您在介绍导览中看到的(您现在已经阅读了,对吗?),Stack Overflow 是针对特定编程问题的,而不是更广泛的讨论。我提出的建议称为“增量编程”,在我数十年的软件开发和教学过程中,我发现它非常有用。
  • 另外,你在一个整体项目上是完全正确的:为 Enemy 创建一个通用类,并让特定的小动物成为它的子类。事实上,您可以让该类包含可以与常用属性(健康、姓名等)交互的任何内容,并让 Player 也成为子类。

标签: python class attributes


【解决方案1】:

好的,Python 类的快速课程。首先,让我们覆盖自我。 Self 是指您为该类创建的对象。所以让我们说:

zombie1 = Zombie("bob")

本例中的self指的是对象“zombie1”

现在,使用方法的属性。将类视为封装一些通用数据的东西。你已经把那部分写下来了。现在属性是类包含的那些通用数据类型。例如,您的僵尸名称、攻击等。要访问它们,我们只需这样做:

zombie1.name
'bob'
zombie1.attack
5

如此等等。这将为您提供附加到这些属性的数据。

现在要创建子类,您可以这样做。

class Enemies(object):

    def __init__(self):
        self.maxhealth = 100

class Zombies(Enemies):

    def __init__(self, name):
        super().__init__()
        self.name = name
        self.health = self.maxhealth
        self.attack = 5
        self.golddrop = random.randint(5, 10)

你可以像这样为它分配一个对象:

zombie2 = Zombie("Mike")

这样的输出将为您提供来自 Zombie 类和 Enemies 类的数据:

zombie2.maxhealth
100
zombie.name
'Mike'
zombie2.attack
5

如此等等。如果你仔细看,你会发现zombie2 有属性maxhealth,尽管它是在Enemies 下初始化和定义的。希望这会有所帮助!

我会让敌人类由你决定,你希望如何创建通用敌人数据以供单个怪物使用。我只是想以 maxhealth 为例来说明它可以从子类中的父类中拉取。

回复评论问题:

要获得玩家姓名,您可以采用两种方式之一,创建一个方法,或在编程时要求它。我会告诉你两种方式。

class Player(object):

    def __init__(self):
        self.name = None
        self.gold = None

    def getName(self):
        self.name = input("Please enter your name: ")
        print(self.name)

player1 = Player()
player1.getName()

当您调用 player1.getName() 时,它会询问他们的姓名并将其存储到 name 变量中。然后您可以通过以下方式调用那里的名称:

player1.name
'Peter'

你也可以这样做:

class Player(object):

    def __init__(self, name):
        self.name = name
        self.gold = None

这样你可以在对象创建时调用玩家的名字,例如:

player1 = Player(input("Please enter your name here: "))

player1.name
'Peter'

这种方式允许您专门编码一个名称,或要求用户提供一个。

最后编辑黄金位在这里:

class Player(object):

def __init__(self, name):
    self.name = name
    self.gold = None

def giveGold(self):
    print("Since you are new, 100 gold dubloons have been given to you!")
    self.gold = 100

所以这让你可以随心所欲地调用 Player()。您可以硬编码名称,或要求用户输入。然后在 Player() 对象上运行 giveGold() 方法,授予他们 100 金币。

player1 = Player("Peter")
player1.giveGold()
Since you are new, 100 gold dubloons have been given to you!
player1.gold
100

希望这是有道理的。我想我已经帮助你很好地开始了。我会把剩下的游戏制作留给你:)

【讨论】:

  • 好的。那么,如果我想让用户输入他们自己的名字呢?会是同一个概念吗?我举个例子。 class Player: def __init__(self, name): self.name = name self.gold = gold Player.name = input("What do you want your name to be?") print("Hello there, {0}!".format(Player.name))。那会是正确的吗?它有效,但我想知道这是否是最有效的方法。顺便说一句,谢谢您的回答。
  • 我会将其附加到我的答案中,如果我当前的答案正确回答了您的问题,请用绿色复选标记标记答案,以表明它是您正在寻找的已接受答案。谢谢
  • 感谢您的编辑。我将在一夜之间离开这篇文章,如果我得到更多答案,我会选择对我最有帮助的答案,但是,如果你的答案是唯一的,我会将你的答案标记为选择的答案。不过谢谢。
  • 另外,我想添加一个新函数来获取用户选择的黄金数量,但我不知道如何调用它:class Player: def __init__(self, name, gold): self.name = name self.gold = gold def get_gold(self): user_gold = int(input("""Your local bank, HSBC (Hydra Sasquatch Banking Corporation), is offering you up to 100 gold doubloons for your travels, as you are new to adventuring.""")) print(user_gold) user_name = Player(input("What do you want your name to be?")) print("Hello there, {0}!".format(user_name)) 有什么想法吗?
  • @SavagePotato 我已经修改了我的答案以包含您所要求的所有内容。我将把游戏的其余部分留给你创造。研究一下,了解我做了什么,为什么做了我所做的,以及我给出的解释,你将毫无困难地完成你的游戏:)