Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 创建类属性的哪种方法更好?为什么?_Python_Class_Instantiation - Fatal编程技术网

Python 创建类属性的哪种方法更好?为什么?

Python 创建类属性的哪种方法更好?为什么?,python,class,instantiation,Python,Class,Instantiation,编程(Python)只花了几个月左右的时间,我正试着对这一点了如指掌,这样我就不会编写效率低下的代码 假设我正在为游戏中的默认敌人创建类。为了清晰起见,我使用了“Beuly01”和“Hale01”(他们都可以考虑不同的“同一”类)。考虑这个伪代码;如果有任何错误,那只是因为我在这篇文章中遗漏了它们,而且代码本身没有问题。如果你有一个更有效的方式来写我写的东西,虽然,它将不胜感激 例1- class ENEMY01: attack = randint(0,20) defense =

编程(Python)只花了几个月左右的时间,我正试着对这一点了如指掌,这样我就不会编写效率低下的代码

假设我正在为游戏中的默认敌人创建类。为了清晰起见,我使用了“Beuly01”和“Hale01”(他们都可以考虑不同的“同一”类)。考虑这个伪代码;如果有任何错误,那只是因为我在这篇文章中遗漏了它们,而且代码本身没有问题。如果你有一个更有效的方式来写我写的东西,虽然,它将不胜感激

例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
如果我想向其中任何一个添加一个新属性(我认为这称为实例属性,因为它不会改变类),那么这两个属性似乎都没有限制-

Bobo.scream = 'Ouch'
Bobo.scream
'Ouch'
Jobo.scream = 'Ouch'
Jobo.scream
'Ouch'
我的猜测是,因为示例2使用方法(如“函数”),所以理论上我可以创建示例2的实例,通过向类中的函数添加更多功能(例如,它对某些攻击或条件作出反应的方式),来对新的“信息”作出反应。我在想,如果我采用示例1的方法,我将不得不在每次需要时在需要的地方添加这种类型的反应式代码,而不是让它在类方法中“活”起来?除了我不能通过在示例1中添加函数来解决这个问题之外

那么,与编写的示例1相比,示例2有哪些优点和缺点(反之亦然),或者有没有更好的重写方法,使其中一个具有不可能与另一个相匹配的优势

旁注- 我现在正在学习一个教程,虽然他从示例1开始,并转到了示例2中的样式,但我仍然可以完成他在示例1中所做的一切(除了实例化时更改值),而他却让我觉得(没有解释)例子2是如此的优越和不同。这就是我的问题。也许在实例化时更改值的能力比我认为的更重要?

两者都不是“更好”,因为它们是不同的

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
对于上述情况,每个新实例将获得相同的默认值,并在程序的连续运行中更改。如果它选择
12
进行
攻击
,则每个实例都将有一次
攻击
12
。下次启动该程序时,您将获得另一个应用于每个实例的随机选择值。也许这次每次都是
2

此外,类变量与实例变量有本质上的不同,您不应该使用一个来模仿另一个


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

我想您没有注意到
攻击=randint(1,20)
默认参数将为每个实例生成相同的数字。当您重新运行该程序时,它将只选择一个新的编号。请尝试创建更多具有不同属性的ENEMY01实例,并更改其中一些实例--其他实例会发生什么情况?对HERO01做同样的处理,看看会发生什么,我想你会开始看到不同之处(但先看看Tigerhawk的评论)。谢谢。我已经测试过了,你的答案基本上回答了我的问题,加上我现在对它的理解好多了(今天是真正处理它的第一天)。我注意到,在示例1中,我所有的实例都使用相同的值,我原以为新的(对我来说)ex2会解决这个问题,因为我对init知之甚少,但您的示例澄清了这一点。