[Python笔记]第十一篇:面向对象
以上就是本节对于面向对象初级知识的介绍,总结如下:
- 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用
- 类 是一个模板,模板中包装了多个“函数”供使用
- 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数
- 面向对象三大特性:封装、继承和多态
面向对象基础
什么是面向对象
面向对象有别于传统的面向过程变成,是对一个具体事物的抽象描述,在用编程中的可以提高程序员的工作效率,
值得一提的是在python里面不想Java等语言强制程序员使用面向对象编程,可以采用面向对象和函数混合的
方式进行.
创建类和对象
下面我们来创建一个最基本的类,这个叫做Foo的类:
class Foo:
def __init__(self, name, favor):
self.name = name # 普通字段
self.favor = favor
def intro(self):
print("%s like eat %s" % (self.name, self.favor)) # 类创建对象时候就传入了参数 到构造方法
bob = Foo("Bob", "apple")
sam = Foo("Sam", "orange") # 执行类方法时候不需要传参数了
bob.intro()
sam.intro()
类名字定义是由class关键字空格加类名字Foo加冒号组成;
这个类里面有两个def开头的像是函数一样的东西,我们叫做它"方法";
这个类里面有一个"__init__"的特殊方法我们叫做它"构造方法";
而另外一个def开头的方法则叫做普通方法;
类的实例化是有一个对象名字加等号类的名字加上一个括号,括号里面是我们需要传入的参数;
类的执行是对象名字加一个点加上类里面的方法加一对括号;
类是对事物的抽象化
对象是类的实例化
面向对象三大特征
1.封装
封装就是:我们定义的类必然要生成不同的对象,封装就是封装那些不重复的类都要使用的字段
class Foo:
# 构造方法里面的所有成员叫做普通字段
# 在根据类创建对象的时候自动执行
def __init__(self, name, favor):
self.name = name # 普通字段
self.favor = favor # 根据Foo类创造对象
# 自动执行Foo类的__init__方法
bob = Foo("Bob", "apple")
self 是一个形式参数,当执行 bob = Foo("Bob, "apple") 时,self 等于 bob
当执行 sam = Foo("Sam", "orange") 时,self 等于 sam
所以,内容(name/favor)其实被封装到了对象bob 和 sam 中,每个对象中都有 name 和 age 属性.
那么封装的内容我们如何调用呢?
直接调用:通过 对象.方法调用
class Foo:
def __init__(self, name, favor):
self.name = name # 普通字段
self.favor = favor bob = Foo("Bob", "apple")
print("%s like eat %s" % (bob.name, bob.favor))
间接调用:通过self间接调用内容
class Foo:
def __init__(self, name, favor):
self.name = name # 普通字段
self.favor = favor def show_detail(self):
print("%s like %s" % (self.name, self.favor)) bob = Foo("Bob", "apple")
bob.show_detail()
有一个同学叫小明,他年龄5岁体重90斤,做一次健身体重减轻,吃一次东西会相应增肥:
class Person:
# 构造方法
def __init__(self, name, age, weight):
# 普通字段
self.Name = name
self.Age = age
self.Weight = weight
# 方法
def chidongxi(self):
self.Weight += 2 def jianshen(self):
self.Weight -= 1 p1 = Person('小明', 5, 90) # 实例化出一个类,包含基本信息(姓名/年龄/体重)
p1.jianshen() # 执行健身方法减重
p1.chidongxi() # 执行吃东西方法增肥
p1.chidongxi()
p1.chidongxi()
p1.jianshen()
print(p1.Weight) # 查看最终体重
减肥游戏
2.继承
单一继承
狗和猫都属于动物类,动物都有吃东西喝水的动作,然而狗却是汪汪叫,猫是喵喵叫;所以创建狗和猫两个类之前可以创建一个叫做动物的基类,
让动物拥有吃东西喝水的方法,让狗和猫继承动物的一些基本方法,这样创建其他动物时候就只要创建它们特殊的方法就ok了!
#!/usr/bin/env python
# -*- coding: utf-8 -*- class Animals:
def chi(self):
print(self.name + "吃东西") def he(self):
print(self.name + "喝水") class Dog(Animals):
def __init__(self, name):
self.name = name def jiao(self):
print(self.name + "旺旺叫") class Cat(Animals):
def __init__(self, name):
self.name = name def jiao(self):
print(self.name + "喵喵叫") zhaocai = Dog("招财")
zhaocai.chi()
zhaocai.he()
zhaocai.jiao() xiaomi = Cat("小咪")
xiaomi.jiao()
单一继承
所以,对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法。
注:除了子类和父类的称谓,你可能看到过 派生类 和 基类 ,他们与子类和父类只是叫法不同而已。
多继承
继承的顺序: 查找自身 ---- 继承类(左边----右边)
经典类/新式类多继承情况下的两种查找顺序:
- 经典类时,多继承情况下,按照深度优先方式查找
- 新式类时,多继承情况下,按照广度优先方式查找
#!/usr/bin/env python
# -*- coding: utf-8 -*- class God:
def bar(self):
print 'God.bar' class A(God):
def ba(self):
print 'A.bar' class B(God):
def bar(self):
print 'B.bar' class C(A):
def ba(self):
print 'C.bar' class D(B):
def ba(self):
print 'D.bar' class E(C, D):
def ba(self):
print 'E.bar' e = E()
e.bar()
经典类多继承
#!/usr/bin/env python
# -*- coding: utf-8 -*- class God(object):
def bar(self):
print 'God.bar' class A(God):
def ba(self):
print 'A.bar' class B(God):
def bar(self):
print 'B.bar' class C(A):
def ba(self):
print 'C.bar' class D(B):
def ba(self):
print 'D.bar' class E(C, D):
def ba(self):
print 'E.bar' e = E()
e.bar() #B.bar
新式类多继承
总结:
python2.7未继承object时(经典类),则深度搜索优先(一条道走到黑).
python2.7继承object(新式类),则广度搜索优先,顶部(指共同继承一个基类)最后.
python3里面只有新式类,执行广度优先
3.多态
Pyhon不支持多态并且也用不到多态,多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚“鸭子类型”。
[Python笔记]第十一篇:面向对象的更多相关文章
- 【python自动化第十一篇】
[python自动化第十一篇:] 课程简介 gevent协程 select/poll/epoll/异步IO/事件驱动 RabbitMQ队列 上节课回顾 进程: 进程的诞生时为了处理多任务,资源的隔离, ...
- python学习笔记-(十一)面向对象进阶&异常处理
上篇我们已经了解了一些面向对象的基础知识,本次就了解下面向对象的一些进阶知识(虽然我也不知道有什么卵用). 静态方法 静态方法是一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作.使 ...
- [Python笔记]第三篇:深浅拷贝、函数
本篇主要内容:深浅拷贝,自定义函数,三目运算,lambda表达式, 深浅拷贝 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. import ...
- Python笔记_第二篇_面向过程_第二部分_2.路径、栈和队列、内存修改
这一部分分三个主题进行讲解,主要为后面的模块.包.第三方库的概念补充一些相关的内容. 1. 路径(Path): 相对路径和绝对路径. 举例1:我们先导入一个os库(模块)来观察一下路径 import ...
- [Python笔记]第八篇:模块
本篇主要内容:python常用模块用法介绍 什么是模块 模块,用一大段代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性 ...
- [Python笔记]第六篇:文件处理
本篇主要内容:open文件处理函数的使用 open函数,该函数用于文件处理 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 文件句柄 = open('文件路径', '模式') 打 ...
- [Python笔记]第五篇:递归
本篇主要内容:递归以及冒泡排序 参考文章:(http://www.cnblogs.com/balian/archive/2011/02/11/1951054.html) 递归的概念 递归的概念很简单, ...
- [Python笔记]第四篇:内置函数
本篇主要内容:内置函数 函数 参考:https://docs.python.org/3.5/library/functions.html 内置函数列表 一.数学运算类 abs(x)求绝对值 >& ...
- A Byte of Python 笔记(9) 面向对象编程
第11章 面向对象编程 面向过程:根据操作数据的函数或语句块来设计程序. 面向对象(OOP, object-oriented programming):把数据和功能结合起来,用对象包裹组织程序. 类 ...
随机推荐
- android导入项目出错处理
问题: 执行Import-Android下的Existing Android Code Into Workspace 解决方法:
- 怎样把redis编译为库,挪为己用?
其实这是个伪命题.因为只要正常编译redis,那么在 /deps/hiredis/ 目录下就会生成动态库文件 libhiredis.so. 为了便于学习redis源码,编写一些测试程序,并进行单步跟踪 ...
- 关于ETL的几种运行
一:代码部分 1.新建maven项目 2.添加需要的java代码 3.书写mapper类 4.书写runner类 二:运行方式 1.本地运行 2. 3. 三:本地运行方式 1.解压hadoop到本地 ...
- 计算任意位数的Pi
当用程序实现求pi的值时,也许你能够很快写出算法(利用求pi的几个公式),但是由于使用单变量保存结果,限于计算机硬件对变量的表示范围有限,因此,最多只能计算出pi值小数点后十多位.但需要得到一个更大位 ...
- [转] add-apt-repository
PS: 有些项目提供的是deb 地址,那么把deb地址加到repository里,下面是一个例子: sudo apt-get update sudo add-apt-repository 'deb h ...
- Android(java)学习笔记245:ContentProvider使用(银行数据库创建和增删改查的案例)
1. Android的四大组件: (1)Activity 用户交互的UI界面 (2)Service 后台运行的服务 (3)BroadcastReceiver 广播接收者 (4)ContentPro ...
- Android(java)学习笔记232:Android进程间通讯(IPC)之AIDL
一.IPC inter process communication 进程间通讯 二.AIDL android interface defination language 安卓接口定义语言 满 ...
- linux(centos)上配置nginx、mysql、php-fpm、redis开机启动<转>
原文 http://levi.cg.am/archives/2925 I.nginx开机启动 在/etc/init.d/目录下创建脚本 1 vi /etc/init.d/nginx 更改脚本权限 1 ...
- POJ 1265 Area POJ 2954 Triangle Pick定理
Area Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5227 Accepted: 2342 Description ...
- python与数值计算环境搭建
数值计算的编程的软件很多种,也见过一些编程绘图软件的对比. 利用Python进行数值计算,需要用到numpy(矩阵) ,scipy(公式符号), matplotlib(绘图)这些工具包. 1.Linu ...