有几个原因,但最主要的原因来自 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 的存在(我们可以随心所欲地调用它,它不必是 self)允许区分self
内部类和外部类。同样,这不是我经常做的事情,但是当我这样做时,它非常有用。