python学习之面向对象【入门初级篇】


Posted in Python onJanuary 21, 2017

前言

最近在学习Python的面向对象编程,以前是没有接触过其它的面向对象编程的语言,因此学习这一部分是相当带劲的,这里也总结一下。

概述

  • python支持多种编程范式:面向过程、面向对象、面向切面(装饰器部分)等。
  • 面向过程:根据业务逻辑从上到下写垒代码
  • 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
  • 面向对象:对函数进行分类和封装,让开发“更快更好更强...”

OOP思想

  • 面向对象的基本哲学:世界由具有各自运动规律和内部状态的对象组成,对象之间相互作用和通讯构成了世界。
  • 唯一性,世界没有两片相同的树叶,同样的没有相同的对象。
  • 分类性,分类是对现实世界的抽象。
  • 三大特性:封装、继承和多态

面向对象的三大特性:

一、封装

封装,对具体对象的一种抽象,即将某些部分隐藏起来,在程序外部看不到,即无法调用。

私有化:将类或函数中的某些属性限制在某个区域之内,外部无法调用。

Python中私有化的方法也比较简单,就是在准备私有化的属性(包括方法、数据)名字前面加双下划线。

例如:

class ProtectMe(object): 
 def __init__(self):
 self.me = "qiwsir"
 self.__name = "kivi"
 
 def __python(self):
 print("I love Python.") 
 
 def code(self):
 print9"Which language do you like?")
 self.__python()
 
if __name__ == "__main__":
 p = ProtectMe()
 print(p.me)
 print(p.__name)
 
#运行结果
qiwsir
Traceback (most recent call last):
 File "21102.py", line 21, in <module>
 print p.__name
AttributeError: 'ProtectMe' object has no attribute '__name' 

说明:__name属性隐藏了,无法调用。

调用私有属性,可以使用property函数

class ProtectMe(object): 
 def __init__(self):
 self.me = "qiwsir"
 self.__name = "kivi"
 
 @property
 def name(self):
 return self.__name
 
if __name__ == "__main__":
 p = ProtectMe()
 print(p.name)

#运行结果
 kivi

所以,在使用面向对象的封装特性时,需要:

  • 将内容封装到某处
  • 从某处调用被封装的内容

第一步:将内容封装到某处

python学习之面向对象【入门初级篇】

 self 是一个形式参数,当执行 obj1 = Foo('wupeiqi', 18 ) 时,self 等于 obj1

                              当执行 obj2 = Foo('alex', 78 ) 时,self 等于 obj2

所以,内容其实被封装到了对象 obj1 和 obj2 中,每个对象中都有 name 和 age 属性,在内存里类似于下图来保存。

python学习之面向对象【入门初级篇】

第二步:从某处调用被封装的内容

调用被封装的内容时,有两种情况:

  • 通过对象直接调用
  • 通过self间接调用
class Role(object):
 ac = None #类变量
 def __init__(self,name,role,weapon,life_value):
 #初始化方法
 self.name = name #实例变量(成员变量)
 self.role = role
 self.weapon = weapon
 self.life_val = life_value
 
 def buy_weapon(self,weapon): #定义方法
 #self:表示实例本身
 self.weapon = weapon
 # print("%s is buying [%s]" %(self.name,weapon))
 
#把一个抽象的类变成一个具体的对象的过程,叫实例化
 
p1 = Role("sanjiang",'Police',"B10",90) #实例
t1 = Role("Chunyun",'Terrorist',"B11",100)

二、继承

继承,面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容。

class SchoolMember(object):
 # member_nums = 0
 def __init__(self,name,age,sex):
 self.name = name
 self.age = age
 self.sex = sex
 # self.enroll()
 
 def enroll(self):
 SchoolMember.member_nums += 1
 print("SchoolMember [%s] is enrolled!" %self.name)
 
 def tell(self):
 print("Hello my name is [%s]" %self.name)
 
class Teacher(SchoolMember):
 def __init__(self,name,age,sex,course,salary): #重写父类的__init__方法
 super(Teacher,self).__init__(name,age,sex) #继承(新式类)
 # SchoolMember.__init__(self,name,age,sex) #继承(旧式类)
 self.course = course
 self.salary = salary
 
 def teaching(self):
 print("Teacher [%s] is teaching [%s]" %(self.name,self.course))
 
 
 
class Student(SchoolMember):
 def __init__(self,name,age,sex,course,tuition):
 super(Student,self).__init__(name,age,sex)
 self.course = course
 self.tuition = tuition
 
 def pay_tuition(self):
 print("ca,student [%s] paying tuition [%s] again" %(self.name,self.tuition))

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
Python对象的深拷贝和浅拷贝详解
Aug 25 Python
利用Python获取赶集网招聘信息前篇
Apr 18 Python
一百多行python代码实现抢票助手
Sep 25 Python
python实现简单flappy bird
Dec 24 Python
python装饰器简介---这一篇也许就够了(推荐)
Apr 01 Python
Python3基本输入与输出操作实例分析
Feb 14 Python
PyQt5事件处理之定时在控件上显示信息的代码
Mar 25 Python
Django高并发负载均衡实现原理详解
Apr 04 Python
Django数据结果集序列化并展示实现过程
Apr 22 Python
解决pip安装tensorflow中出现的no module named tensorflow.python 问题方法
Feb 20 Python
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
May 17 Python
python3+PyQt5+Qt Designer实现界面可视化
Jun 10 Python
Python中struct模块对字节流/二进制流的操作教程
Jan 21 #Python
python使用xlrd与xlwt对excel的读写和格式设定
Jan 21 #Python
Python第三方库xlrd/xlwt的安装与读写Excel表格
Jan 21 #Python
python实现的多线程端口扫描功能示例
Jan 21 #Python
Python 字符串大小写转换的简单实例
Jan 21 #Python
linux平台使用Python制作BT种子并获取BT种子信息的方法
Jan 20 #Python
python dict 字典 以及 赋值 引用的一些实例(详解)
Jan 20 #Python
You might like
分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)
2014/01/30 PHP
PHP基于XMLWriter操作xml的方法分析
2017/07/17 PHP
javascript 有趣而诡异的数组
2009/04/06 Javascript
jQuery的实现原理的模拟代码 -1 核心部分
2010/08/01 Javascript
火狐4、谷歌12不支持Jquery Validator的解决方法分享
2011/06/20 Javascript
一些老手都不一定知道的JavaScript技巧
2014/05/06 Javascript
get(0).tagName获得作用标签示例代码
2014/10/08 Javascript
javascript中checkbox使用方法实例演示
2015/11/19 Javascript
jQuery插件dataTables添加序号列的方法
2016/07/06 Javascript
JS+CSS3实现超炫的散列画廊特效
2016/07/16 Javascript
JS中对Cookie的操作详解
2016/08/05 Javascript
详细解读Jquery各Ajax函数($.get(),$.post(),$.ajax(),$.getJSON())
2016/08/15 Javascript
javascript完美实现给定日期返回上月日期的方法
2017/06/15 Javascript
vue-cli项目根据线上环境分别打出测试包和生产包
2018/05/23 Javascript
9102了,你还不会移动端真机调试吗
2019/03/25 Javascript
基于vue和websocket的多人在线聊天室
2020/02/01 Javascript
Vue 实现一个简单的鼠标拖拽滚动效果插件
2020/12/10 Vue.js
[02:47]DOTA2亚洲邀请赛 HR战队出场宣传片
2015/02/07 DOTA
Windows系统配置python脚本开机启动的3种方法分享
2015/03/10 Python
对于Python的框架中一些会话程序的管理
2015/04/20 Python
解决Django模板无法使用perms变量问题的方法
2017/09/10 Python
Python3内置模块random随机方法小结
2019/07/13 Python
python如何实现数据的线性拟合
2019/07/19 Python
python matplotlib包图像配色方案分享
2020/03/14 Python
python装饰器代码深入讲解
2021/03/01 Python
Corelle官方网站:购买康宁餐具
2016/11/02 全球购物
马来西亚太阳镜、眼镜和隐形眼镜网上商店:Focus Point
2018/12/13 全球购物
比利时家具购买网站:Home24
2019/01/03 全球购物
Timberland澳大利亚官网:全球领先的户外品牌
2019/12/10 全球购物
半年思想汇报
2013/12/30 职场文书
《我的第一本书》教学反思
2014/02/15 职场文书
大学新生军训方案
2014/05/03 职场文书
教师党员群众路线教育实践活动心得体会
2014/11/04 职场文书
2014年乡镇安全生产工作总结
2014/12/02 职场文书
nginx如何将http访问的网站改成https访问
2021/03/31 Servers
Mysql 一主多从的部署
2022/05/20 MySQL