0

Python の学習を始めたばかりで、最近、クラスについて学習しているときに問題に遭遇しました。コードを見てください。

class Critter(object):
    """your very own bug generator"""
    total=0
    def status(x):
        print Critter.total
        status=staticmethod(status)
    def __init__(self,name):
        print'a critter has been created'
        self.name=name
        Critter.total+=1


crit1=Critter('pooch')
crit2=Critter('Duff')
crit3=Critter('pluto')

Critter.status()
print'\nAccessing the class attributes through an object:',crit1.total

コードを実行すると、次のエラーが発生します。

line 19, in <module>
Critter.status(Critter.total)
TypeError: unbound method status() must be called with Critter instance as first  
argument(got int instance instead)

バインド/非バインドがどのように機能するかについてはまだ不明です。初心者の質問で申し訳ありませんが、助けていただければ幸いです。

4

2 に答える 2

1

あなたのコードには次の問題がありました:

  • インデントの問題。クラスにバインドする必要がある (つまり、クラスに属する) 定義する変数またはメソッドは、そのクラスの 1 レベル下にインデントする必要があります。
  • は、メソッドの定義のスコープではなく、クラスのstatus=staticmethod(status)下で直接定義する必要があります。を指すstatus()のでstatusCritter.status()
  • メソッドは、少なくともあなたが示した呼び出しに基づいて、status()パラメーターを取らないでください。xCritter.status()

staticmethod表示される上記のエラーは、インデントが正しくないため、Python がクラスの定義で呼び出しを認識しなかったことを示しています。そのため、Python はstatus()メソッドを単なるインスタンス メソッド (デフォルト) として定義しました。インスタンス メソッドの場合、Python は最初のパラメーターがインスタンス ハンドルであると想定します。

これはうまくいくはずです:

class Critter(object):
    """your very own bug generator"""
    total=0

    def status():
        print Critter.total
    status=staticmethod(status)

    def __init__(self,name):
        print 'a critter has been created'
        self.name=name
        Critter.total+=1

crit1=Critter('pooch')
crit2=Critter('Duff')
crit3=Critter('pluto')

Critter.status()
print'\nAccessing the class attributes through an object:',crit1.total

出力:

a critter has been created
a critter has been created
a critter has been created
3

Accessing the class attributes through an object: 3

Python > 2.4 を使用している場合 (おそらくそうです)、@staticmethod代わりにデコレータを使用して、次のように静的メソッドを定義できます。

class Critter(object):
    """your very own bug generator"""
    total=0

    @staticmethod
    def status():
        print Critter.total

    def __init__(self,name):
        print 'a critter has been created'
        self.name=name
        Critter.total+=1
于 2013-03-22T04:17:03.933 に答える
0

コードを次のように変更します。

class Critter(object):
    """your very own bug generator"""

    total = 0

    @staticmethod
    def status():
        print Critter.total

    def __init__(self,name):
        print 'a critter has been created'
        self.name = name
        Critter.total += 1

バインドされたメソッドとバインドされていないメソッドの詳細については、このClass method difference in Python: bound, unbound and static を参照してください。

于 2013-03-22T04:15:33.043 に答える