我正在学习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
这是说我给出了一个位置论点,但我不知道我给了什么。我错过了什么?
答案 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
要了解为什么需要这个参数,这里有很好的答案: