调用类方法会在Python中引发TypeError

时间:2008-12-28 23:36:47

标签: python python-3.x class methods

我不明白如何使用类。当我尝试使用该类时,以下代码给出了一个错误。

class MyStuff:
    def average(a, b, c): # Get the average of three numbers
        result = a + b + c
        result = result / 3
        return result

# Now use the function `average` from the `MyStuff` class
print(MyStuff.average(9, 18, 27))

错误:

File "class.py", line 7, in <module>
    print(MyStuff.average(9, 18, 27))
TypeError: unbound method average() must be called with MyStuff instance as first argument (got int instance instead)

怎么了?

8 个答案:

答案 0 :(得分:87)

您可以通过声明一个变量并将该类调用为一个函数来实例化该类:

x = mystuff()
print x.average(9,18,27)

但是,这不适用于您提供给我们的代码。在给定对象(x)上调用类方法时,它总是在调用函数时将指向对象的指针作为第一个参数传递。因此,如果您现在运行代码,您将看到以下错误消息:

TypeError: average() takes exactly 3 arguments (4 given)

要解决此问题,您需要修改平均方法的定义以获取四个参数。第一个参数是对象引用,剩下的3个参数是3个数字。

答案 1 :(得分:34)

从您的示例中,我觉得您想要使用静态方法。

class mystuff:
  @staticmethod
  def average(a,b,c): #get the average of three numbers
    result=a+b+c
    result=result/3
    return result

print mystuff.average(9,18,27)

请注意,在python中大量使用静态方法通常是一些难闻气味的症状 - 如果你真的需要函数,那么直接在模块级别声明它们。

答案 2 :(得分:13)

要最低限度地修改您的示例,您可以将代码修改为:

class myclass(object):
        def __init__(self): # this method creates the class object.
                pass

        def average(self,a,b,c): #get the average of three numbers
                result=a+b+c
                result=result/3
                return result


mystuff=myclass()  # by default the __init__ method is then called.      
print mystuff.average(a,b,c)

或者更全面地扩展它,允许您添加其他方法。

class myclass(object):
        def __init__(self,a,b,c):
                self.a=a
                self.b=b
                self.c=c
        def average(self): #get the average of three numbers
                result=self.a+self.b+self.c
                result=result/3
                return result

a=9
b=18
c=27
mystuff=myclass(a, b, c)        
print mystuff.average()

答案 3 :(得分:4)

类中的每个函数,以及每个类变量都必须按照指示使用 self 参数。

class mystuff:
    def average(a,b,c): #get the average of three numbers
            result=a+b+c
            result=result/3
            return result
    def sum(self,a,b):
            return a+b


print mystuff.average(9,18,27) # should raise error
print mystuff.sum(18,27) # should be ok

如果涉及类变量:

 class mystuff:
    def setVariables(self,a,b):
            self.x = a
            self.y = b
            return a+b
    def mult(self):
            return x * y  # This line will raise an error
    def sum(self):
            return self.x + self.y

 print mystuff.setVariables(9,18) # Setting mystuff.x and mystuff.y
 print mystuff.mult() # should raise error
 print mystuff.sum()  # should be ok

答案 4 :(得分:1)

在类的python成员函数中需要显式self参数。与C ++中的隐式this指针相同。有关详细信息,请查看this页面。

答案 5 :(得分:1)

你需要花一点时间在面向对象编程的基础上。

这听起来很苛刻,但这很重要。

  • 您的类定义不正确 - 尽管语法恰好可以接受。这个定义完全错了。

  • 您完全没有使用该类来创建对象。

  • 您使用课程进行计算是不合适的。这种事情可以做,但它需要@staticmehod的高级概念。

由于您的示例代码在很多方面都是错误的,因此您无法获得整洁的“修复此”答案。有太多事情需要解决。

您需要查看更好的类定义示例。目前还不清楚你用什么来源学习材料,但是你读的书不管是错还是不完整。

请丢弃您正在使用的任何书籍或来源,并找到更好的书。认真。他们误解了类定义的外观和使用方式。

您可能希望查看http://homepage.mac.com/s_lott/books/nonprog/htmlchunks/pt11.html以更好地介绍类,对象和Python。

答案 6 :(得分:1)

试试这个:

class mystuff:
    def average(_,a,b,c): #get the average of three numbers
            result=a+b+c
            result=result/3
            return result

#now use the function average from the mystuff class
print mystuff.average(9,18,27)

或者这个:

class mystuff:
    def average(self,a,b,c): #get the average of three numbers
            result=a+b+c
            result=result/3
            return result

#now use the function average from the mystuff class
print mystuff.average(9,18,27)

答案 7 :(得分:-2)

您从未创建过实例。

您已将平均值定义为实例方法,因此,为了使用平均值,您需要先创建实例。