如何在Python类构造函数中接受参数?

2024-05-16 00:23:34 发布

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

class Druid:
    def __init__(self, Attack, Defence, Speed, Money, Crit):
        self.attack = DAP
        self.defence = DDP
        self.speed = DSpeed
        self.money = DMoney
        self.crit = DCC
    def Druid_stat(self):
        return '{} {}'.format(self.DAP, self.DDP)

Human_Druid = Druid(8, 7, 3, 50, 5)

print(Human_Druid.Druid_Stat()) 

然后我得到了

Traceback (most recent call last):
  File "/Users/ianbrown/Desktop/Shannara_Cronicles_ALPHA.py", line 13, in <module>
Human_Druid = Druid(8, 7, 3, 50, 5)
  File "/Users/ianbrown/Desktop/Shannara_Cronicles_ALPHA.py", line 5, in __init__
self.attack = DAP
NameError: global name 'DAP' is not defined

这可能真的很明显,我一直比较它与教程代码只是轻微的调整,如类名和属性等


Tags: selfalphainitdefusersdruidfiledap
3条回答

在您的构造函数(__init__)中,您声明您的Druid类的变量是attackdefencespeedmoneycrit。注意:它们都是小写的——构造函数输入(即,Attack, Defence, Speed, Money, Crit)是不同的,因为首字母是大写的。你知道吗

我不明白为什么会出现DAPDDP和其他D的名字,但它们不属于那里。你知道吗

似乎你正在尝试从你正在阅读的任何地方改编一个例子,但是你做了一个大杂烩,保留了你所读的一些东西,同时改变了其他部分,让自己陷入了一个很大的混乱。你知道吗

just with minor adjustments eg. class names and attributes etc.

你需要非常小心地命名。Python不知道变量的含义,也不知道如何从一个名称推断另一个名称。你知道吗

对您来说,攻击DAP具有相同的含义,但这对您来说是显而易见的,对其他人来说不是,当然对Python来说也不是。它看到的只是你给事物起的名字。你知道吗

所以我假设您想要实现的是(从构造函数参数指向相应实例变量的红色箭头):

enter image description here

是吗?为此,您必须与命名保持一致:

class Druid:
    def __init__(self, attack, defence, speed, money, crit):
        self.attack = attack
        self.defence = defence
        self.speed = speed
        self.money = money
        self.crit = crit
    def Druid_stat(self):
        return '{} {}'.format(self.attack, self.defence)

Human_Druid = Druid(8, 7, 3, 50, 5)
print(Human_Druid.Druid_Stat()) 

注意,我还将构造函数中的名称__init__方法更改为小写。虽然在技术上不是必需的,但在Python中,用小写形式(如attack, defence等)编写变量、用CapWords形式编写类名(如Druid)以及用所有UPPERCASE形式编写常量是一种惯例。你知道吗

这不是一个面向对象的问题。您尝试将变量DAP赋给自我攻击但你一开始就没有设定DAP。你知道吗

我想你要做的是:

self.attack = Attack

创建对象时,攻击设置为8。对其他变量也必须这样做。你知道吗

相关问题 更多 >