AttributeError:类型对象'challee'没有属性'display'

时间:2013-08-28 19:44:44

标签: python

当我使用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'

2 个答案:

答案 0 :(得分:1)

您将displaysay方法缩进了太多;它们是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")

然而,这两个电话会做同样的事情。