标签(空格分隔): 面向对象


一,面向对象基础

(1)面向对象概述

面向过程:根据业务逻辑从上到下写代码
函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
面向对象:对函数进行分类和封装,让开发“更快更好更强...”

面向过程编程最易被初学者接受,往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,即:将之前实现的代码块复制到现需功能处。

(2)面向对象编程和函数式编程对比

  1. 函数

    def mail(email,message):

    print('去发吧')

    return True

    mail("chensiqi@126.com","好人")

  2. 面向对象:类和对象

    class Foo:

    def mail(self,email,message):

    print('去发吧')

    return True

    调用(对象,类名)

    obj = Foo()

    通过对象去执行方法

    obj.mail("chensiqi@126.com","好人")

(3)面向对象中对象和类的关系

面向对象编程是一种编程方式,此编程方式的落地需要使用"类"和"对象"来实现,所以,面向对象编程其实就是对"类"和"对象"的使用

  • 类就是一个模板,模板里可以包含多个函数,函数里实现一些功能
  • 对象则是根据模板创建的实例,通过实例对象可以执行类中的函数

  • class是关键字,表示类
  • 创建对象,类名称后加括号即可

(4)面向对象之构造方法

(5)面向对象之应用场景实例

练习一:在终端输出如下信息

  • 小明,10岁,男,上山去砍柴
  • 小明,10岁,男,开车去东北
  • 小明,10岁,男,最爱大保健

  • 老李,90岁,男,上山去砍柴
  • 老李,90岁,男,开车去东北
  • 老李,90岁,男,最爱大保健
面向对象编程:
class Person:
def __init__(self,name,age,sex):
self.Name = name
self.Age = age
self.Sex = sex def action(self):
print (self.Name,self.Age,self.Sex,'上山去砍柴')
print (self.Name,self.Age,self.Sex,'开车去东北')
print (self.Name,self.Age,self.Sex,'最爱大保健')
P1 = Person('小明','10岁','男')
P2 = Person('老李','90岁','男')
P1.action()
P2.action()
函数式编程:
def action(name,age,sex):
print ("{0},{1}岁,上山去砍柴".format('name','age','sex'))
print ("{0},{1}岁,开车去东北".format('name','age','sex'))
print ("{0},{1}岁,最爱大保健".format('name','age','sex')) action('小明','10岁','男')
action('老李','90岁','男')

二,面向对象之对象的封装

面向对象编程:

  • Objext oriented Programming,简称OOP
  • 程序开发的一种方法
  • 一种在程序中包含各种独立而又互相调用的对象的思想
  • 每一个对象都能接数据,处理数据,并将数据传达给其他对象

封装性:

  • 将某些东西包装盒隐藏起来,让外界无法直接使用,只能通过某些特定的方式才能访问
  • 被封装的特性只能通过特定的行为去访问
  • 优点:数据独立性、具有隐藏性和安全性、易于维护

示例:

    class Plane:        #将Plane的特征和行为包装起来
pCount = 0 #需要先创建对象,再访问属性或调用方法
def __init__(self,name,category,carry):
self.name = name
self.category = category #初始化属性
self.carry = carry
Plane.pCount += 1
p1 = plane('平安','播音777',380) #创建对象p1
print ('已生产',Plane.pCount,'架飞机')
print ('飞机名称:{0} 型号:{1} 载客量:{2}'.format(p1.name,p1.category,p1.carry))
p1.name = '魔鬼'
p1.category = '直升飞机'
p1.carry = -40 #修改对象p1的名称、型号、载客量
print ('飞机名称:{0} 型号:{1} 载客量:{2}'.format(p1.name,p1.category,p1carry))

数据隐藏:

  • 解释器对下划线有特殊的解释
  • 名称前单下划线:

    (1)以"_"为名称前缀的属性、方法应该视为API中非公开的部分

    (2)不能用"from module import" 导入
  • 名称前双"__"作为对象属性名称的前缀,外界将无法直接查看和修改该属性
  • 如果类对象的属性或方法需要与外界共享,应避免使用下划线作为其名称的前缀

问:如何为私有属性赋值?

答:通过方法可以为私有属性赋值?

示例:为私有属性赋值

class Plane:
pCount = 0
def__init__(self,__name,__category,__carry):
self.__name = __name
self.__category = __category
self.__carry = __carry
Plane.pCount += 1
def setCarry(self,__carry):
if __carry > 0 :
self.__carry = __carry
else:
print ("载客量的数值不对",__carry)
def getCarry(self): #获取私有属性的值
return self.__carry
p1 = Plane("平安","播音777",380)
print("已生产",Plane.pCount,"架飞机")
p1.setCarry(-40) #将-40赋给carry属性
carryNum = p1.getCarry()
print("飞机载客量是:",carryNum)
p1.setcarry(240) #将240赋给carry属性
carryNum = p1.getCarry()
print("飞机载客量是",carryNum)

三,面向对象之对象的继承

  • 单继承:一个类只有一个直接父类

  • 多继承:一个类有多个直接父类(py2.7x版本示意图)

  • 多继承:一个类有多个直接父类(py3.x版本示意图)

(1)对象的单继承

继承性:

  • 使用已存在的类定义创建新的类

  • 新类的定义中可以增加新的属性和方法

  • 如果B类继承A类,那么B类对象便具有A类的一切属性和方法

  • 称A类为基类,或父类,或超类

  • 称B类为A的派生类或子类

  • 单继承:一个类只有一个直接父类

  • 语法

    class 子类(父类):

    '''类文档字符串'''

    def init(self,参数列表1):

    父类.init(self,参数列表2):

    ... ...

    子类的新增类成员

  • 参数列表1中包含有父类和子类的属性

  • 参数列表2中只包含父类的属性

  • 实现步骤:

示例:实现单继承

  • Plane类派生出军用飞机类和民用飞机类

  • 分析:

    (1)将Plane作为父类,共享属性和方法

    (2)由Plane类派生出2个子类:军用飞机、民用飞机

    (3)在继承Plane类成员后,2个子类分别新增了自身的属性和方法

  • Plane类派生出军用飞机类和民用飞机类:父类(Plane类)定义

     class Plane:
    pCount = 0
    def __init__(self,__name,__category):
    self.name = __name #名称 共有属性
    self.__category = __category #型号
    Plane.pCount += 1
    def showPlaneinfo(self): #共有方法
    print("飞机名称:{0} 类型:{1}".format(self.__name,self.__category))
  • Plane类派生出军用飞机类和民用飞机类:子类(AviomPlane类)定义

     class AvionPlane(Plane):   #继承父类
    def __init__(self,__name,__category,__gun): #子类构造方法
    Plane.___init__(self,__name,__category) #调用父类构造方法
    self.__gun = __gun #可携带的枪炮数 ,添加特有属性
    def setCarry(self,__gun):
    if __gun > 0 :
    self.__gun = __gun
    else:
    print('携带的枪炮数值不对',__gun) #添加特有方法
    def getCarry(self):
    return self.__gun
    def showAvioninfo(self):
    print ('携带的枪炮数量:{0}'.format(self.gun))
  • Plane类派生出军用飞机类和民用飞机类

     p1 = AvionPlane('凯旋','歼10',6)   #创建AvionPlane类对象p1
    print('已生产',p1.pCount,'架飞机')
    p1.showPlaneinfo() #调用Plane类方法
    p1.showAvioninfo() #调用AvionPlane类方法
    p2 = AvionPlane('平安','播音777',240)
    print('已生产',p2.Pcount,'架飞机')
    p2.showPlaneinfo() #创建AvionPlane类对象p2
    p2.showCivillnfo() #调用Plane类方法调用AvionPlane类方法

方法的重写(Override)

  • 假设父类和子类中都有show()方法,那么调用执行子类show()方法的结果是什么?

     class Plane:
    pCount = 0 #生产的飞机数量
    def __init__(self,__name,__category):
    self.name = __name #名称
    self.__category = __category #型号
    Plane.pCount += 1
    def show(self): #父类show()方法
    print("飞机名称:{0} 类型:{1}".format(self.__name,self.__category)) class CivilPlane(Plane): #继承父类
    def __init__(self,__name,__category,__gun):
    Plane.__init__(self.__name,__category)
    self.__carry = carry #载客量
    def show(self): #重写父类show()方法
    print ('携带的枪炮数量:{0}'.format(self.gun)) p = CivilPlane("平安","播音777",240)
    print("已生产",p.pCount,"架飞机") #只调用执行CivilPlane类的show()方法
    p.show()

从零开始学Python第六周:面向对象基础(需修改)的更多相关文章

  1. 从零开始学Python第八周:网络编程基础(socket)

    Socket网络编程 一,Socket编程 (1)Socket方法介绍 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示"打开了一个网络链接",而打开一个Soc ...

  2. 从零开始学Python第七周:面向对象进阶(需修改)

    一,类的属性 (1)示例 通过属性获取已经创建对象的个数 class Plane: pCount = 0 #类属性 def __init__(self,name,category): self.nam ...

  3. 从零开始学Python第0周:Python基本介绍(部分内容来源于网络)

    Python入门介绍 一,Python的基本介绍 (1)概要 Python是一种解释型,面向对象,动态数据类型的高级程序设计语言.常被广泛用于处理系统管理任务和web编程.现如今Python已经成为了 ...

  4. 从零开始学Python网络爬虫PDF高清完整版免费下载|百度网盘

    百度网盘:从零开始学Python网络爬虫PDF高清完整版免费下载 提取码:wy36 目录 前言第1章 Python零基础语法入门 11.1 Python与PyCharm安装 11.1.1 Python ...

  5. 如何从零开始学Python?会玩游戏就行,在玩的过程就能掌握编程

    现在学习编程的人很多,尤其是python编程,都列入高考了,而且因为人工智能时代的到来,编程也将是一门越来越重要的技能. 但是怎么从零开始学python比较好呢?其实,你会玩游戏就行. 从零基础开始教 ...

  6. 小白学 Python(3):基础数据类型(下)

    人生苦短,我选Python 引言 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 前面我们介绍过了数字,本篇我们接着聊另一个常用的基础数据类型:字符串. ...

  7. 小白学 Python(5):基础运算符(上)

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...

  8. 小白学 Python(6):基础运算符(下)

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...

  9. 小白学 Python(7):基础流程控制(上)

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...

随机推荐

  1. Redis 哨兵模式实现主从故障互切换

    200 ? "200px" : this.width)!important;} --> 介绍 Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 S ...

  2. Windows+GCC下内存对齐的常见问题

    结构/类对齐的声明方式 gcc和windows对于modifier/attribute的支持其实是差不多的.比如在gcc的例子中,内存对齐要写成: class X { //... } __attrib ...

  3. 未找到与约束 ContractName Microsoft.VisualStudio.Text.ITextBufferFactoryService RequiredTypeIdentity Microsoft.VisualStudio.Text.ITextBufferFactoryService

    问题:vs2013在装了 之后,重启,打开VS提示: 未找到与约束 ContractName Microsoft.VisualStudio.Text.ITextBufferFactoryService ...

  4. JVM字节码指令

    invokevirtual 调用实例方法 invokespecial 调用父类构造,实例初始化方法,私有方法 dup 复制栈顶数值,并且复制值进栈,pop/pop2为栈顶值出栈 aload_0 加载第 ...

  5. [C#] Socket 通讯,一个简单的聊天窗口小程序

    Socket,这玩意,当时不会的时候,抄别人的都用不好,简单的一句话形容就是“笨死了”:也是很多人写的太复杂,不容易理解造成的.最近在搞erlang和C的通讯,也想试试erlang是不是可以和C#简单 ...

  6. [C#]想说一说嵌套数组

    今天早上,随感而发,随便写了点东西.结果下午的时候看了看评论,吓我一跳.估计是不是写代码的人看散文看得太少了,还是因为现在的人读的书太少了,似乎有有些大惊小怪. 关于Y美女,我声明一下,尽管她很脱俗, ...

  7. Python补充06 Python之道

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python有一个彩蛋,用下面语句调出: import this 该彩蛋的文档记录 ...

  8. 关于Repository、IUnitOfWork 在领域层和应用服务层之间的代码分布与实现

    本来早就准备总结一下关于Repository.IUnitOfWork之间的联系以及在各层中的分布,直到看到田园里的蟋蟀发表的文章:<DDD 领域驱动设计-谈谈 Repository.IUnitO ...

  9. Full Gc经历分析

    背景: 个别机器:内存突然上升,cpu利用率升高. 解决过程 1. jmap dump整个内存镜像 2. 整个文件700多M,使用Jhat打不开 3. 换heapanalyzer,能打开,但没有分析出 ...

  10. C# 复制一个Word文档的部分或全部内容到另一个Word文档

    C# 复制一个Word文档的部分或全部内容到另一个Word文档 我最近喜欢折腾Office软件相关的东西,想把很多Office软件提供的功能用.NET来实现,如果后期能把它用来开发一点我自己的小应用程 ...