14

重複の可能性:
Pythonの@staticmethodと@classmethodの違いは何ですか?

クラスのstaticmethodsについていくつか質問があります。例を挙げて始めましょう。

例1:

class Static:
    def __init__(self, first, last):
        self.first = first
        self.last = last
        self.age = randint(0, 50)
    def printName(self):
        return self.first + self.last
    @staticmethod
    def printInfo():
        return "Hello %s, your age is %s" % (self.first + self.last, self.age)

x = Static("Ephexeve", "M").printInfo()

出力:

Traceback (most recent call last):
  File "/home/ephexeve/Workspace/Tests/classestest.py", line 90, in <module>
    x = Static("Ephexeve", "M").printInfo()
  File "/home/ephexeve/Workspace/Tests/classestest.py", line 88, in printInfo
    return "Hello %s, your age is %s" % (self.first + self.last, self.age)
NameError: global name 'self' is not defined

例2:

class Static:
    def __init__(self, first, last):
        self.first = first
        self.last = last
        self.age = randint(0, 50)
    def printName(self):
        return self.first + self.last
    @staticmethod
    def printInfo(first, last, age = randint(0, 50)):
        print "Hello %s, your age is %s" % (first + last, age)
        return

x = Static("Ephexeve", "M")
x.printInfo("Ephexeve", " M") # Looks the same, but the function is different.

出力

Hello Ephexeve M, your age is 18

staticmethodsでself.attributeを呼び出すことができないようですが、いつ、なぜそれを使用するのかがよくわかりません。私の考えでは、いくつかの属性を持つクラスを作成する場合は、後でそれらを使用し、すべての属性を呼び出せないstaticmethodを持たないようにする必要があります。誰でも私にこれを説明できますか?Pythonは私の最初のプログラミング言語なので、たとえばJavaでも同じだとしたら、わかりません。

4

1 に答える 1

13

それで何を達成しようとしていstaticmethodますか?それが何をするのかわからない場合、あなたはそれがあなたの問題が何であれそれを解決することをどのように期待していますか?

それとも、何をするのか見て遊んでstaticmethodいますか?その場合、ランダムに適用して動作から推測するよりも、ドキュメントを読んでそれが何をするのかを説明する方が生産的です。

いずれにせよ、@staticmethodクラスの関数定義に適用すると、「静的メソッド」になります。「静的」は、残念ながら、プログラミングで最も混乱を招く用語の1つです。ここでは、メソッドがオブジェクトの状態に依存したり、オブジェクトの状態を変更したりしないことを意味します。クラスに静的メソッドがfoo定義されている場合、(クラスのインスタンスがどこにあるか)Barを呼び出すと、属性に何が含まれているかに関係なく、まったく同じことが行われます。実際、インスタンスがない場合と同じように、クラスから直接呼び出すことができます。bar.foo(...)barBarbarBar.foo(...)

これは、インスタンスを静的メソッドに渡さないことで実現されるため、静的メソッドにはselfパラメーターがありません。

静的メソッドが必要になることはめったにありませんが、便利な場合があります。これらは、クラスの外部で定義された単純な関数と実際には同じですが、クラスに配置すると、クラスに「関連付けられた」ものとしてマークされます。通常、これらはクラスに密接に関連することを計算または実行するために使用しますが、実際には特定のオブジェクトに対する操作ではありません。

于 2012-06-06T23:20:07.280 に答える