これは面倒です:
class MyClass:
@staticmethod
def foo():
print "hi"
@staticmethod
def bar():
MyClass.foo()
呼び出しで MyClass に名前を付けずにこれを機能させる方法はありますか? foo()
つまり、最後の行で言うことができますか?
これは面倒です:
class MyClass:
@staticmethod
def foo():
print "hi"
@staticmethod
def bar():
MyClass.foo()
呼び出しで MyClass に名前を付けずにこれを機能させる方法はありますか? foo()
つまり、最後の行で言うことができますか?
foo
欲しいものを使って手に入れる方法はありません。暗黙的なクラス スコープは存在しないためfoo
、ローカルまたはグローバルのいずれかになりますが、どちらも必要ありません。
クラスメソッドの方が便利だと思うかもしれません:
class MyClass:
@classmethod
def foo(cls):
print "hi"
@classmethod
def bar(cls):
cls.foo()
この方法では、少なくともクラスの名前を繰り返す必要はありません。
ありえない。言語設計の問題です。それを C++ と比較すると、this
(Python と同じです。Python ではself
と書くself.var
必要があり、C++ では ではvar
なくと書く必要がありますthis->var
) と独自のクラスの両方がメンバー関数でデフォルトで使用されます。時々それは迷惑です。可能な唯一のことは、その機能に慣れることです。
クラス名を「変数化」します。これは削除されませんが、名前が短くなります。
class MyClass:
@staticmethod
def foo():
print "hi"
@staticmethod
def bar():
c.foo()
c = MyClass
foo
モジュール レベルの関数を作成し、それを次のようにクラスの名前空間に追加することで、ハッキングを行うことができますstaticmethod
。
def foo():
print "hi"
class MyClass(object):
foo = staticmethod(foo)
@classmethod
def bar(cls):
return cls.foo()
def baz(self):
return foo()
c = MyClass()
c.bar()
c.baz()
MyClass.bar()
MyClass.foo()