当我使用python版本3.3.2时,我一直收到这个错误,我没有做任何我在youtube上观看教程并尝试过的东西,但他使用的版本是2.7
>>> class challee:
def cname(self,name):
self.name = name
def display(self):
return self.name
def say(self):
print("help %s" % self.name)
>>> challee
<class '__main__.challee'>
>>> first = challee
>>> second = challee
>>> first.cname(first,"becky")
>>> second.cname(first,"tony")
>>> first.display()
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
first.display()
AttributeError: type object 'challee' has no attribute 'display'
答案 0 :(得分:1)
您将display
和say
方法缩进了太多;它们是challee
类
请注意,您永远不会制作实例;而是创建对该类的多个引用。 调用 *类来生成实例:
first = challee()
second = challee()
然后你不必传递self
的显式参数:
first.cname('becky')
答案 1 :(得分:0)
如果你在一个实例上调用一个方法,就像在Martijn的例子中那样,self
参数会在调用时自动为你添加。所以,对于你的班级:
class challee:
def cname(self,name):
self.name = name
def display(self):
return self.name
def say(self):
print("help %s" % self.name)
你需要创建一个类的实例然后调用你的方法,就像他演示的那样:
a = challee()
a.cname('Becky')
由于这会以self
参数的形式无形地传递实例,因此它等同于针对类调用方法(它不会隐式传递任何内容作为self
)并手动传入实例:
a = challee()
challee.cname(a, 'Becky')
问题是将类传递给self
是一个错误,它必须是一个实例。
您可以使用@staticmethod
装饰器创建一个不需要操作实例的函数:
class challee:
@staticmethod
def say(whatever):
print(whatever)
如果以这种方式定义方法,则根本不需要self作为参数,你可以像这样调用函数:
challee.say("this is a test")
或者像这样:
a = challee()
a.say("this is a test")
然而,这两个电话会做同样的事情。