Python使用class创建对象。没个定义的类都有一个特殊的方法,名为__init__(),可以通过这个方法控制如何初始化对象。
定义类的基本形式:
class Athlete:
def __init__(self):
#The code to initialize a "Athlete" object.
......
创建对象实例:有了类之后,创建对象实例很容易。只需将对类名的调用赋至各个变量。通过
这种方式,类(以及__init__()方法)提供了一种机制,允许你创建一个定制的工厂函数,
用来根据需要创建多个对象实例。与C++系列语言不同,Python中没有定义构造函数“new”
的概念。Python会为你完成对象构建,然后可以使用__init__()方法定制对象的初始状态。
self的重要性
定义一个类时,实际上是在定义一个定制工厂函数,然后可以在你的代码中使用这个工厂函数
创建实例,即:
a = Athlete()
Athlete().__init__(a)
____________________________________________________
Athlete为类名,__init__为方法名,a为对象实例的目标标识符。
在类中定义__init__()方法:
def __init__(self):
# The code to initialize an "Athlete" object.
......
每个方法的第一个参数都是self
实际上,不仅__init__()方法需要self作为它的第一个参数,类中定义的所有其他方法也是如此。
Python要求每个方法的第一个参数为调用对象实例。下面扩展这个实例类,在一个名为thing的对象
属性中存储一个值,具体值在初始化时设置。另外还要扩充一个方法,名为how_big(),它会利用len()
BIF返回thing的长度:
class Athlete:
def __init__(self, value=0):
self.thing = value
def how_big(self):
return(len(self.thing))
---------------------------------------------------------------
现在“初始化”代码将所提供的一个值赋至一个名为“self.thing”的
类属性。
how_big() 方法返回“self.thing”的长度。
在一个对象实例上调用类方法时,Python要求第一个参数是调用对象实例,这往往赋至各个方法的self参数。
只凭这一点就足以解释为什么self如此重要,也可以由此说明编写对象方法时为什么所有对象方法的第一个参
数必须是self。
继承Python内置的list
Python的class允许你从零开始创建一个定制类,就像创建Athlete类那样。不过,class还允许通过继承现有的
其他类来创建一个类,这也包括list,set和dict提供的Python内置数据结构类。通过继承创建的这些类称为子类。
class NameList(list):
def __init__(self, a_name):
list.__init__([])
self.name = a_name
定义了NameList类之后,用它创建一个对象实例,检查对象类型(使用type()BIF),看看它会提供什么内容(使用dir()BIF):
johnny = NameList("John Paul Jones")
>>> type(johnny)
<class '__main__.NameList'>
>>> dir(johnny)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'name', 'pop', 'remove', 'reverse', 'sort']
使用list类提供的一些功能来补充Johnny中储存的数据:
>>> johnny.append("Bass Player")
>>> johnny.extend(["Composer", "Arranger", "Musician"])
>>> johnny
['Bass Player', 'Composer', 'Arranger', 'Musician']
johnny.name
'John Paul Jones'
>>> vera.name
'Vera vi'
由于Johnny是一个列表,所以完全可以对它做列表处理:
>>> for attr in johnny:
print(johnny.name + " is a " + attr + ".")
John Paul Jones is a Bass Player.
John Paul Jones is a Composer.
John Paul Jones is a Arranger.
John Paul Jones is a Musician.