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.