7.2.2 创建自定义类
终于要创建自定义类了!下面是一个简单的示例:
__metaclass__ = type # 如果你使用的是Python 2,请包含这行代码
class Person:
def set_name(self, name):
self.name = name
def get_name(self):
return self.name
def greet(self):
print("Hello, world! I'm {}.".format(self.name))
注意 旧式类和新式类是有差别的。现在实在没有理由再使用旧式类了,但在Python 3之前,默认创建的是旧式类。在较旧的Python版本中,要创建新式类,应在脚本或模块开头放置赋值语句__metaclass__ = type,但我不会在每个示例中都显式地包含这条语句。当然,还有其他解决方案,如从新式类(如object)派生出子类。有关如何派生子类,稍后将详细介绍。如果你使用的是Python 3,就无需考虑这一点,因为根本没有旧式类了。有关这方面的详细信息,请参阅第9章。
这个示例包含三个方法定义,它们类似于函数定义,但位于class语句内。 Person当然是类的名称。 class语句创建独立的命名空间,用于在其中定义函数(参见7.2.5节)。一切看起来都挺好,但你可能想知道参数self是什么。它指向对象本身。那么是哪个对象呢?下面通过创建两个
>>> foo = Person()
>>> bar = Person()
>>> foo.set_name('Luke Skywalker')
>>> bar.set_name('Anakin Skywalker')
>>> foo.greet()
Hello, world! I'm Luke Skywalker.
>>> bar.greet()
Hello, world! I'm Anakin Skywalker.
这个示例可能有点简单,但澄清了self是什么。对foo调用set_name和greet时, foo都会作为第一个参数自动传递给它们。我将这个参数命名为self,这非常贴切。实际上,可以随便给这个参数命名,但鉴于它总是指向对象本身,因此习惯上将其命名为self。
显然, self很有用,甚至必不可少。如果没有它,所有的方法都无法访问对象本身——要操作的属性所属的对象。与以前一样,也可以从外部访问这些属性。
>>> foo.name
'Luke Skywalker'
>>> bar.name = 'Yoda'
>>> bar.greet()
Hello, world! I'm Yoda.
提示 如果foo是一个Person实例,可将foo.greet()视为Person.greet(foo)的简写,但后者的多态性更低。
领取专属 10元无门槛券
私享最新 技术干货