74

クラスPersonと、そのクラスに次の静的メソッドがありますcall_person

class Person:
    def call_person():
        print "hello person"

Python コンソールで、クラス Person をインポートしてPerson.call_person(). しかし、それは私に言うエラーを与えています'module' object has no attribute 'call_person'。このエラーが発生する理由を教えてください。

4

5 に答える 5

153

次のようなことをする必要があります:

class Person:
    @staticmethod
    def call_person():
        print "hello person"

# Calling static methods works on classes as well as instances of that class
Person.call_person()  # calling on class
p = Person()
p.call_person()       # calling on instance of class

やりたいことによっては、classmethod の方が適している場合があります。

class Person:
    @classmethod
    def call_person(cls):
        print "hello person",cls

p = Person().call_person() # using classmethod on instance
Person.call_person()       # using classmethod on class

ここでの違いは、2 番目の例では、クラス自体がメソッドの最初の引数として渡されることです (インスタンスが最初の引数である通常のメソッドや、追加の引数を受け取らない staticmethod とは異なります)。

それでは、実際の質問に答えてください。Personクラスをモジュールに入れているため、メソッドが見つからないに違いありませんPerson.py

それで:

import Person  # Person class is available as Person.Person
Person.Person.call_person() # this should work
Person.Person().call_person() # this should work as well

または、モジュール Person からクラス Person をインポートすることもできます。

from Person import Person
Person.call_person()

これは、何がモジュールで何がクラスかについて少し混乱します。datetime通常、私はクラスが存在するモジュールと同じ名前をクラスに付けないようにしています。ただし、標準ライブラリのモジュールにはdatetimeクラスが含まれているため、これはあまり軽視されていないようです。

最後に、この単純な例にはクラスが必要ないことを指摘しておく価値があります。

# Person.py
def call_person():
    print "Hello person"

別のファイルにインポートします。

import Person
Person.call_person() # 'Hello person'
于 2012-08-01T12:32:43.873 に答える
15

なぜこれが静的メソッドではないのかはすでに誰もが説明していますが、なぜそれが見つからないのかを説明します。クラスではなくモジュールでメソッドを探しているので、このようなもので適切に見つけることができます。

import person_module
person_module.Person.call_person() # Accessing the class from the module and then calling the method

また、@ DanielRosemanが言ったように、Pythonの場合はそうではありませんが、モジュールにJavaのような同じ名前のクラスが含まれていることを想像したかもしれません。

于 2012-08-01T12:38:32.820 に答える
6

Python 3.x では、静的メソッドを次のように宣言できます。

class Person:
    def call_person():
        print "hello person"

ただし、最初のパラメーターが self であるメソッドは、クラス メソッドとして扱われます。

def call_person(self):
    print "hello person"

@staticmethodPython 2.x では、静的メソッドの前にa を使用する必要があります。

class Person:
    @staticmethod
    def call_person():
        print "hello person"

また、静的メソッドを次のように宣言することもできます。

class Person:
    @staticmethod
    def call_person(self):
        print "hello person"
于 2016-06-10T13:35:41.717 に答える
5

これは静的メソッドではありません。試す

class Person:
    @staticmethod
    def call_person():
        print "hello person"

詳細については、こちらを参照してください。

于 2012-08-01T12:34:30.957 に答える
0

デコレータclassmethodを追加する必要があります。

于 2012-08-01T12:35:26.967 に答える