2017-06-01 232 views
3

我在学习Python,目前正在使用类。我正在尝试做一个基本的游戏来帮助学习它,并从它调用方法 有一个奇怪的问题。我有main.py文件,该文件从Character.py文件的类中创建一个实例。为什么我不能从我的Python类中调用方法?

这是Character.py文件:

class Character: 
    name="" 

    def __init__(Name): 
     name=Name 

    def getName(): 
     return name 

这是main.py文件:

from Character import * 

player = Character("James") 
print(player.getName()) 

我不知道是什么问题。这是我得到的错误:

Traceback (most recent call last): 
    File "C:\Users\dstei\Documents\Python\It 102\Final Project\Main.py", line 
12, in <module> 
    print(player.getName()) 
TypeError: getName() takes 0 positional arguments but 1 was given 

这是说我给1位置的论点,但我没有看到我给了什么。我错过了什么?

回答

8

由于您有一个带有实例方法的类,因此您需要包含第一个参数(通过约定self)来引用当前实例。此外,确保设置变量作为一个实例变量使用self,当前实例:

class Character: 
    def __init__(self, Name): #self is the current instance 
     self.name=Name #set the variable on the instance so that every instance of Character has a name 

    def getName(self): 
     return self.name #refer to the name with the instance 

Python的内部将一个类作为第一个参数的所有类方法的新实例,像this用Java等语言编写。错误来自于Python在内部传递实例作为第一个参数的事实,但是您的getter没有被定义为接受参数。

通过上面的代码,当你在一个实例上调用该方法时,实例在内部作为第一个参数传递,Python不会抱怨,因为你指定了一个参数,selfname设置正确该实例。


注:按照惯例,Python不使用驼峰,但强调,所以你应该吸气按照惯例是这样的:

def get_name(self): 
    #... 

另请参阅chepner's answer这就解释了为什么getter和setter不通常需要。只需使用点符号获取并修改实例变量:

print(player.name) #get 
player.name = "Jeff" #set 
+1

和专家发话了,好解释的,共享的感谢,再加上一个 –

+0

谢谢,制作了一套方法如的setName会是这样? def setName(newName): self.name = newName –

+0

@ D.Stei每个实例方法都应该包含self作为它的第一个参数:'def set_name(self,new_name):self.name = new_name' – Li357

0

您忘记添加参数self。 self是对象本身的对象引用,因此它们是相同的。 Python方法不在对象本身的上下文中调用。自我在Python可以用来处理自定义对象模型或

class Character: 

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

    def getName(self): 
     return self.name 

要了解为什么需要这个参数,这里还有这么好的答案:

What is the purpose of self?

4

正如其他人所说,即使实例方法必须声明一个额外的参数,通常名为self(虽然这是一个传统的,而不是必需的名称)。

class Character: 
    def __init__(self, name): 
     self.name = name 

    def get_name(self): 
     return name 

然而,Python没有任何形式的强制可见性(如公共或私有)的,所以这些琐碎的getter和setter通常不被写入。关于您“允许”修改哪些属性的文档被认为是足够的保护。

class Character: 
    def __init__(self, name): 
     self.name = name 

c = Character("Bob") 
print(c.name) # instead of c.get_name() 
c.name = "Charlie" # instead of c.set_name("Charlie") 
+0

啊,是的,我没有提到这一点。 +1 – Li357

+0

嗯,这是很好的知道,谢谢。这是否也适用于列表? –

相关问题