1. ホーム
  2. python

Pythonでstaticメソッドを呼び出す

2023-09-30 10:22:11

質問

私は、クラス Person という名前の静的メソッドがあります。 call_person :

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

PythonコンソールでPersonクラスをインポートし、以下のように呼び出します。 Person.call_person() . しかし、それは私に次のようなエラーを与えています。 'module' object has no attribute 'call_person' . なぜこのようなエラーが発生するのか、どなたか教えていただけませんか?

どのように解決するのですか?

のようにする必要があります。

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'