本文主要通过几个实例介绍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面向对象编程(下)的更多相关文章
-
python面向对象编程(下)
本篇详细介绍了Python 中类的成员.成员修饰符.类的特殊成员以及两个综合运用实例. 环境为:python3.5.1 类的成员 类的成员包括三大类:字段.方法和property属性 注:关于这三类成 ...
-
python 面向对象编程学习
1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...
-
python 面向对象编程(一)
一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...
-
python面向对象编程进阶
python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...
-
Python 面向对象编程——访问限制
<无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...
-
Python 面向对象编程 继承 和多态
Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...
-
python面向对象编程学习
python面向对象编程 基本概念理解 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...
-
Python面向对象编程——继承与派生
Python面向对象编程--继承与派生 一.初始继承 1.什么是继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创 ...
-
Python面向对象编程指南
Python面向对象编程指南(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网 ...
随机推荐
-
线程隔离ThreadLocal
ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地 ...
-
7.6--找过点最多的直线(CC150)
直接两个点确定一条直线.然后两两组合,再写一个看过多少个点的函数.一直更新max就行. import java.util.Arrays; public class Solution { public ...
-
如何处理js的跨域问题
在bill.mail.10086.cn域内访问smsrebuild1.mail.10086.cn下的接口出现“阻止跨域源请求” 例如: URL 说明 是否允许通信 http://www.a.com/a ...
-
openfire+spark+smack实现即时通讯
近公司项目需要用到即时通讯功能,经过调研发现openfire+spark+smack可以实现.在网上找了很久,资料都十分有限,即使有些朋友实现了也说的不清不楚.于是决定自己研究,耗时一周的时间实现了文 ...
-
Win8节省C盘空间攻略
问题分析: 1.系统页面文件(虚拟内存)占用空间 2.自动更新的缓存文件 3.系统保护的备份文件(系统还原用的) 4.休眠文件 5.索引文件 6.桌面文件 解决办法: 1.机器是8G内存,完全不需要虚 ...
-
ffmpeg常用参数一览
基本选项: -formats 输出所有可用格式 -f fmt 指定格式(音频或视频格式) -i filename 指定输入文件名,在linux下当然也能指定:0.0(屏幕录制)或摄像头 -y 覆盖已有 ...
-
Processes and Threads
http://www.cnblogs.com/xitang/archive/2011/09/24/2189460.html Processes and Threads 译者署名: 呆呆大虾 译者微博: ...
-
源码(04) -- java.util.List<;E>;
java.util.List<E> 源码分析(JDK1.7) --------------------------------------------------------------- ...
-
python 序列化模块之 json 和 pickle
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,支持不同程序之间的数据转换.但是只能转换简单的类型如:(列表.字典.字符串. ...
- 关于 enhanced decompiler 3.0 .0不起作用的解决办法