Существует несколько причин, хотя главная из них - это Дзен Питона: «Явный лучше, чем неявный». На языке, подобном 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
внутреннего и внешнего классов. Опять же, это не то, что я часто делаю, но когда я это делаю, это невероятно полезно.
В качестве побочного примечания всегда наследуйте 'object', так что вы используете * классы нового стиля *, то есть' class Student (object): '. –
@Mike Subclassing 'object' в Python 2.x - хорошая практика, но в Python 3 это не нужно, так как все классы являются« новыми ». Я понимаю, что принятие Python 3 является плохим, и если предположить, что OP использует Python 2.x, это разумно, но в какой-то день я надеюсь, что это будет плохое предположение. – gotgenes