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 中 Meta Classes详解
Feb 13 Python
python框架django基础指南
Sep 08 Python
老生常谈python的私有公有属性(必看篇)
Jun 09 Python
Python开发的HTTP库requests详解
Aug 29 Python
详解python上传文件和字符到PHP服务器
Nov 24 Python
用pandas按列合并两个文件的实例
Apr 12 Python
Python实现的本地文件搜索功能示例【测试可用】
May 30 Python
使用python opencv对目录下图片进行去重的方法
Jan 12 Python
利用python和百度地图API实现数据地图标注的方法
May 13 Python
解决tensorflow训练时内存持续增加并占满的问题
Jan 19 Python
Python实现简单的2048小游戏
Mar 01 Python
Python如何把不同类型数据的json序列化
Apr 30 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
用PHP4访问Oracle815
2006/10/09 PHP
PHP数组操作汇总 php数组的使用技巧
2011/07/17 PHP
Extjs学习笔记之六 面版
2010/01/08 Javascript
获取非最后一列td值并将title设为该值的方法
2013/10/30 Javascript
js单例模式详解实例
2013/11/21 Javascript
JavaScript中继承用法实例分析
2015/05/16 Javascript
判断输入的字符串是否是日期格式的简单方法
2016/07/11 Javascript
微信小程序 简单教程实例详解
2017/01/13 Javascript
在 React、Vue项目中使用SVG的方法
2018/02/09 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
2018/03/02 Javascript
JavaScript判断对象和数组的两种方法
2019/05/31 Javascript
vuejs中父子组件之间通信方法实例详解
2020/01/17 Javascript
[01:14]英雄,所敬略同——2018完美盛典宣传视频
2018/12/05 DOTA
Python 变量类型及命名规则介绍
2013/06/08 Python
Python实现检测服务器是否可以ping通的2种方法
2015/01/01 Python
Python for Informatics 第11章之正则表达式(二)
2016/04/21 Python
从零开始学Python第八周:详解网络编程基础(socket)
2016/12/14 Python
python数据处理 根据颜色对图片进行分类的方法
2018/12/08 Python
pandas.DataFrame的pivot()和unstack()实现行转列
2019/07/06 Python
selenium中get_cookies()和add_cookie()的用法详解
2020/01/06 Python
Python中join()函数多种操作代码实例
2020/01/13 Python
Python获取二维数组的行列数的2种方法
2020/02/11 Python
Python程序慢的重要原因
2020/09/04 Python
Python实现Word文档转换Markdown的示例
2020/12/22 Python
CSS3制作精致的照片墙特效
2016/06/07 HTML / CSS
全球酒店预订网站:Hotels.com
2016/08/10 全球购物
Airbnb爱彼迎官网:成为爱彼迎房东,赚取收入
2019/03/14 全球购物
银行领导班子四风对照检查材料
2014/09/27 职场文书
机关干部三严三实心得体会
2014/10/13 职场文书
劳动纠纷调解协议书格式
2014/11/30 职场文书
2014年机关党委工作总结
2014/12/11 职场文书
药房管理制度范本
2015/08/06 职场文书
职工培训工作总结
2015/08/10 职场文书
2016年幼儿园庆六一开幕词
2016/03/04 职场文书
职场新人知识:如何制定一份合理的工作计划?
2019/09/11 职场文书
解决Golang中goroutine执行速度的问题
2021/05/02 Golang