TypeError:恰好接受1个参数(给定2个)TypeError:'str'对象不可调用

时间:2018-06-25 21:04:56

标签: python class

我希望重新学习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

谢谢!

2 个答案:

答案 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

或者您可以创建一个新类