いくつかの理由がありますが、主な理由は Zen of Python からのものです。「明示的は暗黙的よりも優れている」。C++ のような言語では、クラスのメソッドには常にthis
、メソッドが呼び出されるたびにスタックにプッシュされる暗黙の引数があります。この場合、b
グローバル変数と同様にインスタンス変数が存在するとb
、ユーザーはb
一方を参照するだけで、もう一方が使用されることに気付かないことがあります。そのため、Python では、混乱を避けるためにスコープを明示する必要があります。
そうは言っても、他の理由もあります。たとえば、クラスの外部で関数を定義し、実行時にクラスにアタッチすることがあります。例えば:
def log(self):
print "some library function requires all objects to have a log method"
print "unfortunately we're using the Student class, which doesn't have one"
print "this class is defined in a separate library, so we can't add the method"
print "fortunately, we can just add the method dynamically at runtime"
Student.log = log
ここで、self
明示的であるという事実により、クラスの外で関数を定義し、それをそのクラスにアタッチすることは簡単になります。私はこの種のことを信じられないほど頻繁に行うわけではありませんが、そうするときは非常に役立ちます.
さらに複雑な例を次に示します。単体テストなどの目的で、別のクラス内にクラスを定義したいとします。
class SomeUnitTests(TestCase):
def test_something(self):
class SomeMockObject(SomeActualObject):
def foo(self2):
self.assertEqual(self2.x, SOME_CONSTANT)
some_lib.do_something_with(SomeMockObject)
self
ここでは、明示的な自己 (任意の名前を付けることができます。自己である必要はありません) の存在により、内部クラスと外部クラスを区別することができます。繰り返しますが、これは私が頻繁に行うことではありませんが、そうすると信じられないほど役に立ちます。