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

时间:2016-09-10 20:25:05

标签: python oop

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

它可能非常明显,我只是通过微小的调整将它与教程代码进行比较,例如。类名和属性等。

4 个答案:

答案 0 :(得分:2)

  

只需进行微调即可。类名和属性等。

你需要非常小心命名。 Python不知道你的变量意味着什么或如何从另一个推断出一个名称。

你可能很明显 Attack 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)和所有{中的常量)来编写变量是一种惯例。 {1}}。

答案 1 :(得分:1)

这不是OOP问题。您尝试将变量DAP分配给self.attack,但您从未在第一时间设置DAP。

我想要做的是:

self.attack = Attack

创建对象时,Attack设置为8。您也必须对其他变量执行相同的操作。

答案 2 :(得分:0)

在您的构造函数(__init__)中,您声明Druid类'变量为attackdefencespeed,{{1 }和money。注意:它们都是小写的问题 - 你的构造函数输入(即crit)因首字母大写而不同。

我不明白为什么Attack, Defence, Speed, Money, CritDAP和其他DDP名称会显示,但他们不属于那里。

似乎你正试图从你正在阅读的任何地方调整一个例子,但你已经做了一个大杂烩,保留你读到的一些内容,同时改变其他部分,让你自己陷入了很多混乱。

答案 3 :(得分:0)

您收到的错误似乎来自未声明的“DAP”。 尝试在方法之前声明这些变量,并为类提供对象类型

D

您也可以在init方法中声明变量

class Druid(object):
    DAP = 0
    DDP = 0
    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()) 

最后,我可能在这方面不正确,但是您将值传递给方法,而不使用它们?所以你可能正在寻找的是这样的:

class Druid(object):

        def __init__(self, Attack, Defence, Speed, Money, Crit):
            DAP = 0
            DDP = 0
            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())