有几个原因,但主要的原因来自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。再次强调,我并不经常这样做,但当我这样做时,它非常有用。
object
以便使用新式类,即class Student(object):
。 - Mike Grahamobject
是良好的编程实践,但在 Python 3 中,这是不必要的,因为所有类都是“新式”的。我意识到 Python 3 的普及率较低,并且假设 OP 使用的是 Python 2.x 是合理的,但希望有一天这将是一个错误的假设。 - gotgenes