Python面向对象编程(下)
本文主要通过几个实例介绍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 | 面向对象编程
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/56 本文地址:http://www.showmeai.tech/article-det ...
随机推荐
- 由一次报错引发的对于Spring创建对象的理解
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'ent ...
- Lua IDE工具-Intellij IDEA+lua插件配置教程(Chianr出品)
Lua 编译工具IDE-Intellij IDEA 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Ch ...
- 几个特殊的IP地址
1)私有地址 IP地址在全世界范围内唯一,看到这句话你可能有这样的疑问,像192.168.0.1这样的地址在许多地方都能看到,并不唯一,这是为何?Internet管理委员会规定如下地址段为私有 ...
- 初窥async,await
首先是一道今日头条的面试题:(听说是今日头条的并且已经烂大街了) async function async1() { console.log( 'async1 start' ) await async ...
- Java实现带logo的二维码
Java实现带logo的二维码 二维码应用到生活的各个方面,会用代码实现二维码,我想一定是一项加分的技能.好了,我们来一起实现一下吧. 我们实现的二维码是基于QR Code的标准的,QR Code是由 ...
- 学习笔记TF038:实现估值网络
Q-Learning,学习Action对应期望值(Expected Utility).1989年,Watkins提出.收敛性,1992年,Watkins和Dayan共同证明.学习期望价值,从当前一步到 ...
- ios-上传图片到后台
做第一个项目时,有个版块的个人信息的编辑涉及到头像修改,老大说项目里有通用的代码,让我自己去找.总算找到,搞了许久才弄好,看来理解能力还需要提高啊!! #pragma mark- 修改头像上传后保存 ...
- Keepalived+LVS实现高可用负载均衡双主模式
LVS是一种集群(Cluster)技术:采用IP负载均衡技术和基于内容请求分发技术.调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一 ...
- mysql下载以及安装
因为xampp怎么都连接不上mysql,我感觉有可能是因为装mysql的时候试了很多次才安装成功,之前的mysql没有卸载干净造成的,今天把mysql卸载干净,又重新安装配置环境,但是还是连接不上,然 ...
- kafka原理和实践(四)spring-kafka消费者源码
系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...