为什么我不能从Python类中调用方法?

时间:2017-06-01 00:58:03

标签: python

我正在学习Python并且目前正在使用类。我正在尝试制作一个基本游戏来帮助学习它,并且在调用方法时遇到了一个奇怪的问题 从中。我有main.py文件,它在Character.py文件中的类中创建一个实例。

这是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

这是说我给出了一个位置论点,但我不知道我给了什么。我错过了什么?

3 个答案:

答案 0 :(得分: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内部传递类的新实例作为所有类方法的第一个参数,例如Java中的this类。这个错误来自于Python将实例作为内部的第一个参数传递但是你的getter没有定义为参数。

使用上面的代码,当你在一个实例上调用方法时,实例在内部作为第一个参数传递,并且当你指定它需要一个参数self时,Python不会抱怨在实例上正确设置了name

注意:按照惯例,Python不使用camelCase,而是强调,所以按照惯例,你的getter应该是这样的:

def get_name(self):
    #...

另请参阅chepner's answer,其中解释了为什么通常不需要吸气剂和固定剂。只需使用点表示法获取并修改实例变量:

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

答案 1 :(得分:4)

正如其他人所提到的,即使是实例方法也必须使用额外的参数声明,通常名为self(尽管这是一个传统的,不是必需的名称)。

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

    def get_name(self):
        return name

但是,Python没有任何强制可见性(例如公共或私有),因此通常不会写这些琐碎的getter和setter。关于您是哪些属性的文档&#34;允许&#34;被修改被认为是足够的保护。

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")

答案 2 :(得分:0)

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

class Character:  

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

    def getName(self):  
        return self.name

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

What is the purpose of self?