我不明白如何使用类。当我尝试使用该类时,以下代码给出了一个错误。
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)
怎么了?
答案 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)
您从未创建过实例。
您已将平均值定义为实例方法,因此,为了使用平均值,您需要先创建实例。