web-dev-qa-db-ja.com

pythonで静的メソッドを呼び出す

クラスPersonと、そのクラスに_call_person_という静的メソッドがあります。

_class Person:
    def call_person():
        print "hello person"
_

pythonコンソールでクラスPersonをインポートし、Person.call_person()を呼び出します。しかし、_'module' object has no attribute 'call_person'_というエラーが表示されます。このエラーが発生していますか?

49
Sadiksha Gautam

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

class Person(object): #always inherit from object.  It's just a good idea...
    @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

実行したい内容に応じて、クラスメソッドがより適切な場合があります。

class Person(object):
    @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クラスが含まれているため、これはあまり見落とされていないようです。 。

最後に、この単純な例ではクラスをneedしないことを指摘する価値があります。

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

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

import Person
Person.call_person() #'Hello person'
110
mgilson

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

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

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

14
jamylak

それはnot静的メソッドです;試してみる

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

詳細については here を参照してください。

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

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

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

def call_person(self): "hello person"を出力します

ただし、python 2.xでは、静的メソッドの前に '@staticmethod'を使用する必要があります

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

これとして静的メソッドを宣言することもできます

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

デコレータクラスメソッド を追加する必要があります。

0
Pran