本文主要通过几个实例介绍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. C# 异步通信 网络聊天程序开发 局域网聊天室开发

    Prepare 本文将使用一个NuGet公开的组件技术来实现一个局域网聊天程序,利用组件提供的高性能异步网络机制实现,免去了手动编写底层的困扰,易于二次开发,扩展自己的功能. 在Visual Stud ...

  2. JDBC driver连接MySQL运行报错The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than

    出错原因: 因为安装mysql的时候时区设置的不正确. mysql默认的是美国的时区,而我们中国大陆要比他们迟8小时,采用GMT+8:00格式. 也就是说是数据库和系统时区差异所造成的. 验证:运行c ...

  3. cocos2dx创建win32项目一般步奏

    1.导入一个新项目步奏:解决方案:右键->添加->添加现有项目->添加依赖项目libCocoStudioD:\work\CannonDefender\cocos2d\cocos\ed ...

  4. Python学习之路基础篇--02Python基础+小作业

    1 变量 变量就是将一些运算的中间结果暂存到内存中,以便后续代码调用.必须由数字,字母,下划线任意组合,且不能数字开头.不能是python中的关键字,如['and', 'as', 'assert', ...

  5. javascript继承的6种方法

    1原型式继承 简介:对类式继承的封装,过渡对象相当于子类. function inheritObject(o) { //声明过渡函数对象 function F() {} //过渡对象的原型继承父类 F ...

  6. 洛谷P1605:迷宫(DFS)

    题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫中移动有上下左右 ...

  7. centos下配置maven编译环境

    版本centos6jdk1.7findbugs-3.0.1maven-3.0.5protobuf-2.6.0安装yum install lzo-devel zlib-devel gcc gcc-c++ ...

  8. (33)关于django中路由自带的admin + 建表关系的讲解

    admin是django自带的后台管理,在初始的时候就默认配置好了 当输入ip地址的时候后面跟admin,就会登陆管理员的后台,这个是django自带的,可以快速管理数据表(增删改查) PS:ip地址 ...

  9. python学习路程1

    常用的转义字符还有: \n 表示换行 \t 表示一个制表符 \\ 表示 \ 字符本身 任务 请将下面两行内容用Python的字符串表示并打印出来: Python was started in 1989 ...

  10. Updates were rejected because the tip of your current branch is behind 问题出现解决方案

    提供如下几种方式: 1.使用强制push的方法(多人协作时不可取): git push -u origin master -f 2.push前先将远程repository修改pull下来 git pu ...