本文主要通过几个实例介绍Python面向对象编程中的封装、继承、多态三大特性。

封装性

我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性。代码如下:

#-*- coding:utf-8 -*-

#类的创建
class Student(object): def __init__(self, name, age):
self.name = name
self.age = age if __name__ == '__main__':
stu1 = Student('Zhangsan', 18)
stu1.age = -1
print stu1.age

实例中将Stu1对象的age属性值成功修改为-1,这在程序中没有问题。但在现实生活中是不合理的。因此,在进行Student类设计时,需要对age、name属性做一些访问限定,不允许外界随便访问。这就需要实现类的封装。

所谓类的封装是指在定义一个类时,将类中的属性私有化,私有属性只能再它所在类中被访问。为了能让外界访问私有属性,可以设置公共接口去获取或者修改属性值。我们通过修改代码,实现Student类的封装。修改后代码如下:

#-*- coding:utf-8 -*-

#类的创建
class Student(object): def __init__(self):
self.__name = ""
self.__age = 0 def setName(self, name):
self.__name = name def setAge(self, age):
if (age > 0):
self.__age = age
else:
print "input age invalid" def getName(self):
return self.__name def getAge(self):
return self.__age
if __name__ == '__main__':
stu1 = Student()
stu1.setName("Zhangsan")
stu1.setAge(-1)
print "stu1.getName() = %s" % (stu1.getName(),)
print "stu1.getAge() = %d" % (stu1.getAge(),)

代码说明:

(1)name、age定义有实例私有属性。Python没有类似Java中的private、procoted、public的修饰符去区分实例私有属性和实例公有属性。而是通过在属性的名字前以是否存在两个下划线开始为标志,如果存在双下划綫就表示为私有属性。反之,则表示公有属性。

(2)setName()、setAge()方法用于设置属性的值,可以在函数里增加逻辑对输入的参数进行判断。getName()、getAge()方法作为外部接口,用于获取属性的值。实现了对属性操作的封装。

继承性

继承是面向对象的重要特性之一。通过继承可以创建新类,目的是使用或修改现有类的行为。原始的类称为父类或超类,新类称为子类或派生类。继承可以实现代码的重用。Python在类名后使用一对括号表示继承的关系,括号中的类即为父类。如果父类定义了__init__方法,子类必须显示调用父类的__init__方法。如果子类需要扩展父类的行为,可以添加__init__方法的参数。下面这段代码演示了继承的实现。

#-*- coding:utf-8 -*-

#类的创建
class Fruit(object):
def __init__(self, color): #__init__为类的构造函数
self.color = color #实例属性
print "Fruit's color = %s " % (self.color,) def grow(self):
print "Fruit grow()" class Apple(Fruit): #继承自Fruit类
def __init__(self, color, name): #子类的构造函数
Fruit.__init__(self, color) #显式调用父类的构造函数
print "Apple's color = %s " % (self.color,)
self.name = name #新增属性 def sale(self):
print "Apple sale()" # 改写父类中的grow方法 class Banana(Fruit): #继承自Fruit类
def __init__(self, color): #子类的构造函数
Fruit.__init__(self, color) #显式调用父类的构造函数 def grow(self): #新增方法
print "Banana grow()" if __name__ == '__main__':
apple = Apple('red', 'apple') #
apple.grow() #继承父类的grow方法,可以直接调用
apple.sale()
banana = Banana('yellow')
banana.grow() #

例子中Apple类通过继承Fruit类,自动拥有了color属性和grow()方法。通过继承的方式,可以减少代码的重复编写。

多态性

继承机制说明子类具有父类的公有属性和方法,而且子类可以扩展自身的功能,添加新的属性和方法。因此,子类可以替代父类对象,这种特性称为多态性。由于Python的动态类型,决定了Python的多态性。下面看吧这一段代码。

#-*- coding:utf-8 -*-

#类的创建
class Fruit(object):
def __init__(self, color=None): #__init__为类的构造函数
self.color = color #实例属性 class Apple(Fruit): #继承自Fruit类
def __init__(self, color='red'): #子类的构造函数
Fruit.__init__(self, color) #显式调用父类的构造函数 class Banana(Fruit): #继承自Fruit类
def __init__(self, color='yellow'): #子类的构造函数
Fruit.__init__(self, color) #显式调用父类的构造函数 class Fruitshop(object):
def sellFruit(self, fruit):
if isinstance(fruit, Apple):
print "sell apple"
if isinstance(fruit, Banana):
print "sell apple"
if isinstance(fruit, Fruit):
print "sell Fruit"
if __name__ == '__main__':
shop = Fruitshop()
apple = Apple()
banana = Banana()
shop.sellFruit(apple)
shop.sellFruit(banana)

输出结果如下:

sell apple
sell Fruit
sell apple
sell Fruit

在Fruitshop类中定义了sellFruit()方法,该方法提供参数fruit。sellFruit()根据不同的水果类型返回不同的结果。实现了一种调用方式不同的执行结果。这就是多态。利用多态性,可以增加程序的灵活性和可扩展性。

Python面向对象编程(下)的更多相关文章

  1. python面向对象编程(下)

    本篇详细介绍了Python 中类的成员.成员修饰符.类的特殊成员以及两个综合运用实例. 环境为:python3.5.1 类的成员 类的成员包括三大类:字段.方法和property属性 注:关于这三类成 ...

  2. python 面向对象编程学习

    1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...

  3. python 面向对象编程(一)

    一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...

  4. python面向对象编程进阶

    python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...

  5. Python 面向对象编程——访问限制

    <无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...

  6. Python 面向对象编程 继承 和多态

    Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...

  7. python面向对象编程学习

    python面向对象编程 基本概念理解 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...

  8. Python面向对象编程——继承与派生

    Python面向对象编程--继承与派生 一.初始继承 1.什么是继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创 ...

  9. 图解python | 面向对象编程

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/56 本文地址:http://www.showmeai.tech/article-det ...

随机推荐

  1. 剑指Offer 32. 把数组排成最小的数 (数组)

    题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 题目地址 h ...

  2. 【leetcode】448. Find All Numbers Disappeared in an Array

    problem 448. Find All Numbers Disappeared in an Array solution: class Solution { public: vector<i ...

  3. 【EMV L2】SDA静态数据认证处理流程

    [静态数据认证] 静态数据认证处理过程中,卡片没有执行任何处理,终端执行的处理流程:1.认证中心公钥的获取终端使用卡片上的认证中心公钥索引(PKI)[TAG:8F,Certification Auth ...

  4. mod_conference ESL控制一(原理)

    本文介绍通过freeswitch mod_conference 的配置和APP,以及如何通过这些事件实现会议控制. 需求 ESL内联,发起会议.加人.踢人.静音.恢复静音.申请发言.结束会议等基础功能 ...

  5. APDL link180单元

    目录 APDL代码实现link180单元的使用 结果图片 APDL代码实现link180单元的使用 由于不知道怎样使用LINK180单元,故按照相关的教程和理解,整理了一下比较完整的APDL的代码.其 ...

  6. Restful Service 中 DateTime 在 url 中传递

    在C# url 中一旦包特殊字符,请求可能就无法送达.可以使用如下方法,最为便捷. 请求端: beginTime.Value.ToString("yyyyMMddHHmmss") ...

  7. Python调用ffpmeg和ffprobe处理视频文件

    需求: 运营有若干批次的视频.有上千个,视频文件,有mp4格式的,有ts格式的 现在有需要去掉视频文件片头和片尾的批量操作需求. 比如 文件夹A下面的视频去掉片尾10秒 文件夹B下面的视频去掉片头6秒 ...

  8. 关于DBX Framewrok 和 FireDac 的一点随笔

    DBX Framework (dbExpress Framework )用了很长的时间, 一直觉得简单好用,但今天需要连MySQL5.7, 发现已经没办法用了,感觉是时候放弃用它来作数据连接了. 以前 ...

  9. [转]Python如何引入自定义模块?

    转自 http://www.cnblogs.com/JoshuaMK/p/5205398.html Python运行环境在查找库文件时是对 sys.path 列表进行遍历,如果我们想在运行环境中注册新 ...

  10. AIUI开放平台:多轮对话返回前几轮语槽数据

    编写云函数: AIUI.create("v2", function(aiui, err){ // 获取 response response = aiui.getResponse() ...