面向对象编程
类是对象的定义,实例是“真正的实物”,
创建一个类
class MyNewObjectType(bases): 'define MyNewObjectType class' class_suite
根据上面,关键字是class 紧接着就是一个类名。随后是定义类的代码,这里通常是各种各样的定义和申明组成。
object 是所有“类之母”,如果定义的类没有继承人和其他父类,object将作为默认的父类。他位于所有类继承结构的最上层。
方法
类的功能有个通俗的说法叫做方法。方法也就是我们常常在类中定义的函数,只能被实例化后调用。调用一个方法的途径:1.定义类(和声明方法) 2. 创建一个实例 3.最后一步就是实例化后调用方法了
例如
class MyDataWithMethod(object): #定义类 def printFoo(self): #声明一个方法,这里是用函数定义的了吧? print 'you invoked printFoo()'
这里的 self 参数迷惑我很久了,当时没有认真看书,现在好好做笔记。这是笔记自然有个人的想法和经历。这里的self就是一个默认值。当然,你也可以用其他的,不过大家都用self看着自然大家都明白。不然时间久了,我们自己看代码都迷惑了
那么下面我们来调用这个方法了
myObj = MyDataWithMethod() #创建实例 myObj.printFoo() #调用方法 you invoked printFoo() #打印出的结果
在过去,一直被一个东西困扰__init_()当时基本上看到源码都有这个东西,困扰了。很迷茫。没看书,也不知道该怎么看。好吧,后来在书上找到了答案
__init__() 就是一种特殊的方法,类似于构造器,在创建一个新的对象时候被调用。而在python中,它不是一个构造器,因为python没有“new”这样的关键字。python在创建实例后,在实例化过程中,调用 __init__() 方法,当一个类被实例化时,就可以定义额外的行为,比如,设定初始值或者运行一些初步诊断代码――――主要是在实例被创建后,实例化调用返回这个实例之前,去执行某些特定的任务或设置
用一个例子来说明:
class AddrBookEntry(object): #类的定义 'address book entry class' def __init__(self, nm, ph): #定义构造器 self.name = nm #设置 name self.phone = ph #设置 phone值 print 'Created instance for: ', self.name def updatePhone(self, newph): #定义方法 self.phone = newph print 'Updated phone# for: ', self.name
创建实例 (实例化)
joe = AddrBookEntry('JOE','02026211623') joe = AddrBookEntry('JOE','03026211623')
实例化调用,会自动调用 __init__() 。self 把实例对象自动传入 __init__()。你可以在脑子里把方法中的 self 用实例名替换掉。在上面第一个例子中,当对象joe被实例化后,joe.name 就被设置了
如果不存在默认的参数,那么传给 __init__() 的两个参数在实例化时是必须的
访问属性
现在来访问joe的两个属性分别为 name 和phone
>>> joe.name 'joe is ' >>> joe.phone '03026211623'
方法的调用 (通过实例)
joe.updatePhone('03026211623')
下面是在IDLE下面的命令和打印出的值
>>> joe.updatePhone('04026211623') Updated phone# for: JOE
现在来访问joe的phone 属性了
>>> joe.phone '04026211623'
说明已经更新成功
类的继承:创建子类
靠继承来进行子类话是创建和制定新类类型的一种方式,新的类将已存在类所有的特性,而不会改动原来类的定义。对于子类来说,他继承了父类的属性,子类也可以定制属于自己的特定功能
下面来实例进行说明
class EmplADDrBookEntry(AddrBookEntry): 'Employee Address Book Entry class' #员工地址 def __init__(self, nm, ph, id, em): AddrBookEntry.__init__(self,nm, ph) self.empid = id self.email = em def updateEmail(self, newem): self.email = newem print 'Update e-mail address for: ', self.name
上面我们创建了一个子类, EmplADDrBookEntry,它继承了父类 AddrBookEntry 中继承了updatePhone()的方法,当然我们也给它定义了 __init__(),updateEmail()方法
如果不定义子类自己的构造器,它会调用基类也就是父类的构造器
现在子类拥有了下面四个属性: 员工id,电子邮件,当然还有父类的电话号码和名字
下面来使用子类
>>> joe = EmplADDrBookEntry('joe',05082153587,22,'[email protected]') SyntaxError: invalid token >>> joe = EmplADDrBookEntry('joe',5082153587,22,'[email protected]') Created instance for: joe >>> joe = EmplADDrBookEntry('joe','05082153587',22,'[email protected]') Created instance for: joe >>>
上面出现问题了,这里应该好好体会一下,不是0开头的数字就可以,如果以0开头的数字就成了字符串?
下面分别来访问属性
>>> joe <__main__.EmplADDrBookEntry object at 0x01D2C510> >>> joe.name 'joe' >>> joe.phone '05082153587' >>> joe.email '[email protected]' >>> joe.updatePhone <bound method EmplADDrBookEntry.updatePhone of <__main__.EmplADDrBookEntry object at 0x01D2C510>> >>> joe.updatePhone('[email protected]') Updated phone# for: joe >>> joe.email '[email protected]' 下面我们来更新属性 >>> joe.updateEmail('[email protected]') Update e-mail address for: joe >>> joe.email '[email protected]'
类是一种数据结构,我们可以用它来定义对象,类是现实世界的抽象的实体以编程形式出现。实例是这些对象的具体化。
def functionName(args): 'function documentation string' #函数文档字符串 function_suite #函数体 class ClassName(object): 'class documentation string' #类文档字符串 class_suite
#类体
类的属性
属性就是属于另一个对象数据或者函数元素,可以哦那个个我们熟悉的句点属性标识法来访问。
类的数据属性,数据属性仅仅用来定义类的变量。
类的数据属性实例
class a(object): foo = 100 print a.foo 100 a.foo = a.foo +1 101
类的方法
类的方法仅仅是作为类定义一部分定义的函数。
>>> class MyClass(object): def myNoActonMethod(): pass >>> m = MyClass() >>> m.myNoActonMethod() Traceback (most recent call last): File "<pyshell#51>", line 1, in <module> m.myNoActonMethod() TypeError: myNoActonMethod() takes no arguments (1 given) >>>
这里调用自身,所以失败了
实例化
如果说类是一种数据结构定义类型,那么实例则是声明一个这种类型的变量。类被实例化后得到实例。
==========================待续======================================