哪种创建 class 属性的方法更好,为什么?

Which way of creating class attributes is better and Why?

只有几个月左右的编程时间 (Python),我正在努力解决这个问题,这样我就不会写出低效的代码。

假设我正在为游戏中的默认敌人创建 classes。我使用 'ENEMY01' 和 'HERO01' 只是为了清楚起见(它们都可以认为 'same' class 的写法不同)。考虑这个伪代码;如果有任何错误,那只是因为我在 post 中遗漏了它们,而且我的代码本身没有问题。如果你有更有效的方式来写我写的东西,我将不胜感激。

示例 1-

class ENEMY01:
    attack = randint(0,20)
    defense = randint(1,20)
    health = 100

示例 2-

class HERO01:
    def __init__(self, attack=randint(1,20),defense=randint(1,20), health=100)
        self.attack = attack
        self.defense = defense
        self.health = health

在我看来,示例 1 更好,因为它更短且更容易理解。对于示例 2,由于默认值,您可以坚持使用默认值或在实例化时更改它们。我知道这可能是一个小好处,但我注意到您也可以在创建两个示例后立即更改这些默认值-

Jobo = ENEMY01()
Jobo.attack
10
Jobo.attack = 15
Jobo.attack
15

Bobo = HERO01()
Bobo.attack
10
Bobo.attack = 15
Bobo.attack
15

如果我想向其中任何一个添加新属性(我认为这称为实例属性,因为它不会更改 class),似乎都没有限制-

Bobo.scream = 'Ouch'
Bobo.scream
'Ouch'
Jobo.scream = 'Ouch'
Jobo.scream
'Ouch'

我的新手 猜测 是因为示例 2 使用方法(如 'function' 中),理论上我可以创建示例 2 的实例,这些实例能够对新的'information' 通过向 class 中的函数添加更多功能(例如,它对某些攻击或条件做出反应的方式)。我在想,如果我走示例 1 的路线,我将不得不在每次需要它的地方添加这种类型的反应代码,而不是让它在 class 方法中 'live' ?除了我不能通过向示例 1 添加函数来解决该问题吗?

那么示例 2 相对于示例 1 的优点和缺点是什么(反之亦然),或者是否有更好的方法来重写其中之一以给出一个不可能匹配 比对方有优势?

旁注- 我现在正在学习一个教程,看起来即使他从示例 1 开始,并且已经转向示例 2 中的样式,我仍然可以完成他在示例 1 中所做的一切(除了更改值在实例化时),但他似乎(没有解释)示例 2 更加优越和不同。因此我的问题。也许在实例化时更改值的能力比我认为的更重要?

"better," 也不是,因为它们不同。

class ENEMY01:
    def __init__(self):
        self.attack = randint(0,20)
        self.defense = randint(1,20)
        self.health = 100

对于上述情况,每个新实例都会有不同的随机值。

class HERO01:
    def __init__(self, attack=randint(1,20),defense=randint(1,20), health=100)
        self.attack = attack
        self.defense = defense
        self.health = health

对于上述内容,每个新实例都将获得相同的默认值,并在程序的连续运行中发生变化。如果它为 attack 选择 12,每个实例都会有一个 12attack。下次您启动该程序时,您会得到另一个随机选择的值应用于每个实例。也许这次每个实例都是 2

此外,class 变量与实例变量有本质区别,您不应该使用一个来模仿另一个。

总的来说,您应该将 __init__() 与您打算调用和使用 class 的方式相匹配。