Pythonのmain()は単なる関数名です。一般的なイディオム
if __name__ == '__main__':
#do something
このファイルのコードがモジュールとしてインポートされるのではなく、プログラムとして実行されていることを理解するためのショートカットです。
Pythonはタイプフリーを目的としているため、コミュニティは規則とベストプラクティスに重点を置いています。これはコンパイラと同じレベルの予測可能性を提供しませんが、混乱を寄せ付けないようにするのに役立ちます。読みやすさはPythonのコアバリューであり、このようなイディオムは価値のある構造を提供します。
Pythonは、他の言語がサポートしているという意味で、関数のオーバーロードをサポートしていません。強く型付けされた言語では、同じ名前で入力引数が異なる同じ関数の複数のバージョンを作成できます。
void DoSomething (int a) {};
void DoSomething (float f) {};
void DoSomething (string s){};
Pythonには、同等のイディオムはありません。ほとんどの場合、これは不要です。数値演算の場合、入力番号がfloat、intなどであるかどうかは気にせず、正しい演算子をサポートしているだけです。ここで、「ダックタイピング」のPythonマントラが登場します。アヒルのように歩き、アヒルのようにクワクワクする場合は、アヒルです。そのため、 Python関数は、型をチェックするのではなく、着信引数で関数または演算子を慣用的に探します。
インスタンスと静的メソッドの場合:Pythonでは、すべてのインスタンスメソッドは、関数の最初の引数として所有するインスタンスを暗黙的に取得します。
class Test(object):
def __init__(self, arg):
self.variable = arg
def example(self):
print self.variable
fred = Test(999) # note: no 'self' passed here
fred.example()
>>> 999
joe = Test(-1)
joe.example()
>>> -1
クラスメソッドは、暗黙の最初の引数として、インスタンスではなくクラスタイプを取得します。クラスメソッドは、インスタンススコープではなくクラススコープで定義されているクラスレベルの変数を参照できますが、特定のインスタンスについては何も知りません。
class TestCls (Test)
CLASS_VARIABLE = "hello"
# other behavior inherited from Test
@classmethod
def class_example(cls):
print cls.CLASS_VARIABLE
barney = TestCls(123)
barney.example()
>>> 123
barney.class_example() # again, no explicit class passed in
>>> 'hello'
静的メソッドは暗黙の引数をまったく取得しません。
class TestStatic (TestCls):
CLASS_VARIABLE = 'goodbye'
# inherited stuff again
@staticmethod
def static_test():
print "behold, I have no implicit argument"
静的メソッドとクラスメソッドも、呼び出されるインスタンスを必要としません。
wilma = TestStatic(123)
wilma.static_test() # you can call from an instance
>>> behold, I have no implicit argument
# or not:
TestStatic.static_test()
>>> behold, I have no implicit argument
TestStatic.class_example()
>>> goodbye # the method is inherited, but the class variable come from this class