Python——面向对象编程(引言)

来源:互联网 发布:ava编程思想 编辑:程序博客网 时间:2024/04/30 00:15

一、类和实例

        类和实例相互关联着:类是对象的定义,而实例是“真正的实物”。下面的实例展示了如何创建一个类:

[python] view plaincopy在CODE上查看代码片派生到我的代码片
  1. >>> class MyNewObjectType(bases):  
  2. ...     'define MyNewObjectType class'  
  3. ...     class_suite  
  4. ...  
        关键字是 class,紧接着是一个类名。随后是定义类的类体代码。类必须继承至少一个父类,参数 bases 可以是一个(单继承)或多个(多重继承)用于继承的父类。object是“所有类之母”。如果你的类没有继承任何其他父类,object将作为默认的父类。它位于所有类继承结构的最上层。

        创建一个实例的过程称作实例化,过程如下:

[python] view plaincopy在CODE上查看代码片派生到我的代码片
  1. >>> myFirstObject = MyNewObjectType()  
        类名使用我们所熟悉的函数操作符(()),以“函数调用”的形式出现。然后通常会把这个新建的实例赋给一个变量。

        类即可以很简单,也可以很复杂。最简单的情况,类仅用作名称空间(namespace)。这意味着你把数据保存在变量中,对他们按名称空间进行分组,使得他们处于同样的关系空间中——所谓的关系是使用标准Python句点属性标识。

[python] view plaincopy在CODE上查看代码片派生到我的代码片
  1. >>> mathObj = MyData()  
  2. >>> mathObj.x = 4  
  3. >>> mathObj.y = 5  
  4. >>> mathObj.x + mathObj.y  
  5. 9  
        实例名字 mathObj 将 mathObj.x 和 mathObj.y 关联起来。这就是使用类作为名字空间容器。mathObj.x 和 mathObj.y 是实例属性,因为他们不是类 MyData 的属性,而是实例对象(mathObj)的独有属性。

二、方法

        在Python 中,方法定义在类定义中,但只能被实例所调用。也就是说,调用一个方法的最终途径必须是这样的:(1)定义类(和方法);(2)创建一个实例;(3)最后一步,用这个实例调用方法。

[python] view plaincopy在CODE上查看代码片派生到我的代码片
  1. >>> class MyDataWithMethod(object):  
  2. ...     def printFoo(self):  
  3. ...             print('You invoked printFoo()!')  
  4. ...  
        self 参数,它在所有的方法声明中都存在。这个参数代表实例对象本身,当你用实例调用方法时,有解释器悄悄地传递给方法的,所以,你不需要自己传递 self 进来,因为它是自动传入的。一般的方法会需要这个实例(self),而静态方法或类方法不会,其中类方法需要类而不是实例。

[python] view plaincopy在CODE上查看代码片派生到我的代码片
  1. >>> myObj = MyDataWithMethod()  
  2. >>> myObj.printFoo()  
  3. You invoked printFoo()!  
        介绍一个特殊的方法 __init__(),__init__() 类似于类构造器。Python 创建实例后,在实例化过程中,调用 __init__() 方法,当一个类被实例化时,就可以定义额外的行为。

三、创建一个类(类定义)

[python] view plaincopy在CODE上查看代码片派生到我的代码片
  1. >>> class AddrBookEntry(object):  
  2. ...     'address book entry class'  
  3. ...     def __init__(self, nm, ph):  
  4. ...             self.name = nm  
  5. ...             self.phone = ph  
  6. ...             print('Created instance for:'self.name)  
  7. ...     def updatePhone(self, newph):  
  8. ...             self.phone = newph  
  9. ...             print('Updated phone# for:'self.name)  
  10. ...  
  11. >>>  
         在 AddrBookEntry 类的定义中,定义了两个方法:__init__() 和 updatePhone()。

四、创建实例(实例化)

[python] view plaincopy在CODE上查看代码片派生到我的代码片
  1. >>> john = AddrBookEntry('John Doe''408-555-1212')  
  2. Created instance for: John Doe  
  3. >>> jane = AddrBookEntry('Jane Doe''650-555-1212')  
  4. Created instance for: Jane Doe  
        如果不存在默认的参数,那么传给 __init__() 的两个参数在实例化时是必须的。

五、访问实例属性

[python] view plaincopy在CODE上查看代码片派生到我的代码片
  1. >>> john  
  2. <__main__.AddrBookEntry object at 0x01E0FB30>  
  3. >>> john.name  
  4. 'John Doe'  
  5. >>> john.phone  
  6. '408-555-1212'  
  7. >>> jane.name  
  8. 'Jane Doe'  
  9. >>> jane.phone  
  10. '650-555-1212'  
六、方法调用(通过实例)

[python] view plaincopy在CODE上查看代码片派生到我的代码片
  1. >>> john.updatePhone('415-555-1212')  
  2. Updated phone# for: John Doe  
  3. >>> john.phone  
  4. '415-555-1212'  
七、创建子类

        靠继承来进行子类化是创建和定制新类型的方式,新的类将保持已存在类所有的特性,而不会改变原有类的定义。新的子类可以定制只属于它的特定功能。除了与父类或基类的关系外,子类与通常的类没有什么区别,也行一般类一样进行实例化。

[python] view plaincopy在CODE上查看代码片派生到我的代码片
  1. >>> class EmplAddrBookEntry(AddrBookEntry):  
  2. ...     'Employee Address Book Entry class'  
  3. ...     def __init__(self, nm, ph, id, em):  
  4. ...             AddrBookEntry.__init__(self, nm, ph)  
  5. ...             self.empid = id  
  6. ...             self.email = em  
  7. ...     def updateEmail(self, newem):  
  8. ...             self.email = newem  
  9. ...             print('Updated e-mail address for:'self.name)  
  10. ...  
        在上面的类中,不仅定义了 __init__(),updateEmail() 方法,而且还从 AddrBookEntry中继承了 updatePhone() 方法。

        如果需要,每个子类最好定义它自己的构造器,不然,基类的构造器会被调用。然而,如果子类重写基类的构造器,基类的构造器就不会被自动调用了——这样,基类的构造器就必须显示写出才会被执行。这里要显示传递 self 实例对象给基类构造器,因为我们不是在该实例中而是在一个子类实例中调用基类的__init__方法的。

八、使用子类

[python] view plaincopy在CODE上查看代码片派生到我的代码片
  1. >>> john = EmplAddrBookEntry('John Doe''408-555-1212'42'john@spam.doe')  
  2. Created instance for: John Doe  
  3. >>> john  
  4. <__main__.EmplAddrBookEntry object at 0x01E0FC30>  
  5. >>> john.name  
  6. 'John Doe'  
  7. >>> john.phone  
  8. '408-555-1212'  
  9. >>> john.email  
  10. 'john@spam.doe'  
  11. >>> john.updatePhone('415-555-1212')  
  12. Updated phone# for: John Doe  
  13. >>> john.phone  
  14. '415-555-1212'  
  15. >>> john.updateEmail('john@doe.spam')  
  16. Updated e-mail address for: John Doe  
  17. >>> john.email  
  18. 'john@doe.spam' 
0 0
原创粉丝点击