-1

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

2 回答 2

1

display您将and方法缩进say得太远了;它们是类的嵌套函数challee

请注意,您从不创建实例;相反,您正在创建对该类的多个引用。调用* 类来产生一个实例:

first = challee()
second = challee()

然后您不必为self任何一个传递显式参数:

first.cname('becky')
于 2013-08-28T19:46:32.597 回答
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参数传入,因此它等效于针对类调用方法(它不会隐式传递任何内容 as 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")

但是,这两个调用会做同样的事情。

于 2013-08-28T20:28:17.440 回答