我希望重新学习python,所以我正在编写一个小型测试类。我正在制作男孩类,并尝试创建一个名为“害羞男孩”的Boy实例,该实例将说明他是什么样的男孩(害羞的男孩)和“你好”
class Boy(object):
def __init__(self, name, shoe):
self.name = name
self.shoe = shoe
def speak(s):
return s
def shoeShize(shoe):
return "my shoe size is " + shoe
def myName(name):
return "hello i am a " + name
#class shyBoy(Boy)
shyBoy = Boy("shy boy", 9)
shyBoy.speak("hello")
print shyBoy.name("shy boy")
现在我遇到了以下错误:
Traceback (most recent call last):
File "boy.py", line 17, in <module>
shyBoy.speak("hello")
TypeError: speak() takes exactly 1 argument (2 given)
➜ ~ python boy.py
Traceback (most recent call last):
File "boy.py", line 19, in <module>
print shyBoy.name("shy boy")
TypeError: 'str' object is not callable
谢谢!
答案 0 :(得分:0)
语音需要作为参数传递self
,因为您计划从类的实例中调用它。
对于第二个问题,您的功能被命名为myName
,而类的属性被命名为name
。如果要打印初始化时提供的关联的name
,只需使用print shyBoy.name
。如果要尝试使用myName
函数,请使用print shyBoy.myName("shy boy")
。请注意,name
缺少括号,因为它不是函数,因此不带参数。
(但是,如果您已经将name
保存在myName
中,为什么要尝试将__init__
作为参数传递给SELECT ... FROM db_table WHERE ifnull(analyzed, '') < ...;
,我有点困惑?)< / p>
答案 1 :(得分:0)
您在函数名称中缺少self
参数:
class Boy(object):
def __init__(self, name, shoe):
self.name = name
self.shoe = shoe
def speak(self, s):
return s
def shoeShize(self, shoe):
return "my shoe size is " + shoe
def myName(self, name):
return "hello i am a " + name
如果您未指定self
,Python将默认考虑您给它的第一个参数self
。除非您用@staticmethod
装饰方法,否则self
将始终是默认的第一个参数,并且会隐式传递参数。因此,在方法调用中,从技术上讲,您是在说boy_inst.method(self, myarg)
。因此,如果该函数只期望self
并且您也给它name
,那么它将说“您给了我太多参数”。这样可以解决参数数字错误
对于您看到的字符串错误
boy.name
是类变量,而不是函数。因此,说boy.name('hi')
并没有设置类变量,而是试图调用名为name
的类方法:
def name(self, arg):
return arg
您在类的实例化上设置了name
shyboy = Boy("name", 9)
这将设置实例变量。要更改这些设置,您要么需要定义一个方法,例如
# In my Boy class
def change_name(self, newname):
self.name = newname
或者您可以创建一个新类