您的位置:首页 > 编程语言 > Python开发

python 学习之 --面向对象编程

2014-04-30 16:13 501 查看
面向对象编程

类是对象的定义,实例是“真正的实物”,
创建一个类

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,'joe@joe.com')
SyntaxError: invalid token
>>> joe = EmplADDrBookEntry('joe',5082153587,22,'joe@joe.com')
Created instance for:  joe
>>> joe = EmplADDrBookEntry('joe','05082153587',22,'joe@joe.com')
Created instance for:  joe
>>>

上面出现问题了,这里应该好好体会一下,不是0开头的数字就可以,如果以0开头的数字就成了字符串?
下面分别来访问属性

>>> joe
<__main__.EmplADDrBookEntry object at 0x01D2C510>
>>> joe.name
'joe'
>>> joe.phone
'05082153587'
>>> joe.email
'joe@joe.com'
>>> joe.updatePhone
<bound method EmplADDrBookEntry.updatePhone of <__main__.EmplADDrBookEntry object at 0x01D2C510>>
>>> joe.updatePhone('joe@gmail.com')
Updated phone# for:  joe
>>> joe.email
'joe@joe.com'
下面我们来更新属性
>>> joe.updateEmail('joe@gmail.com')
Update e-mail address for:  joe
>>> joe.email
'joe@gmail.com'
类是一种数据结构,我们可以用它来定义对象,类是现实世界的抽象的实体以编程形式出现。实例是这些对象的具体化。

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)
>>>

这里调用自身,所以失败了

实例化
如果说类是一种数据结构定义类型,那么实例则是声明一个这种类型的变量。类被实例化后得到实例。

==========================待续======================================
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: