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

面向对象编程

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

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


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

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

==========================待续======================================

你可能感兴趣的:(面向对象,python,继承人)