-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

displayandメソッドのインデントが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引数として渡すため、クラスに対してメソッドを呼び出し (暗黙的に何も渡さないself)、インスタンスを手動で渡すことと同じです。

a = challee()
challee.cname(a, 'Becky')

問題は、クラスを as として渡すのはエラー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")

ただし、これら 2 つの呼び出しは同じことを行います。

于 2013-08-28T20:28:17.440 に答える