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简单实现enum功能的方法
Apr 25 Python
Python 获得13位unix时间戳的方法
Oct 20 Python
Django admin实现图书管理系统菜鸟级教程完整实例
Dec 12 Python
Python使用cx_Oracle模块操作Oracle数据库详解
May 07 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
Feb 26 Python
python装饰器简介---这一篇也许就够了(推荐)
Apr 01 Python
python初学者,用python实现基本的学生管理系统(python3)代码实例
Apr 10 Python
python添加菜单图文讲解
Jun 04 Python
python中如何实现将数据分成训练集与测试集的方法
Sep 13 Python
python七种方法判断字符串是否包含子串
Aug 18 Python
Python爬虫开发与项目实战
Dec 16 Python
python实现图片批量压缩
Apr 24 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
PHP 配置open_basedir 让各虚拟站点独立运行
2009/11/12 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
2014/12/18 PHP
WordPress 插件——CoolCode使用方法与下载
2007/07/02 Javascript
深入分析jQuery的ready函数是如何工作的(工作原理)
2015/12/17 Javascript
jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象
2016/01/23 Javascript
深入浅析JS Function()构造函数
2016/08/22 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
2016/09/09 Javascript
Bootstrap风格的WPF样式
2016/12/07 Javascript
jQuery弹出窗口打开链接的实现代码
2016/12/24 Javascript
javascript循环链表之约瑟夫环的实现方法
2017/01/16 Javascript
ReactNative Image组件使用详解
2017/08/07 Javascript
tangram.js库实现js类的方式实例分析
2018/01/06 Javascript
ES6 Array常用扩展的应用实例分析
2019/06/26 Javascript
一步一步实现Vue的响应式(对象观测)
2019/09/02 Javascript
使用flow来规范javascript的变量类型
2019/09/12 Javascript
vue-cli3使用mock数据的方法分析
2020/03/16 Javascript
基于JavaScript实现贪吃蛇游戏
2020/03/16 Javascript
vue根据条件不同显示不同按钮的操作
2020/08/04 Javascript
vue 判断两个时间插件结束时间必选大于开始时间的代码
2020/11/04 Javascript
JavaScript实现点击图片换背景
2020/11/20 Javascript
Python中%r和%s的详解及区别
2017/03/16 Python
解决阿里云邮件发送不能使用25端口问题
2020/08/07 Python
突袭HTML5之Javascript API扩展5—其他扩展(应用缓存/服务端消息/桌面通知)
2013/01/31 HTML / CSS
Envie de Fraise意大利:法国网上推出的孕妇装品牌
2020/10/18 全球购物
LINUX下线程,GDI类的解释
2016/12/14 面试题
找工作最新求职信
2013/12/22 职场文书
投标邀请书范文
2014/01/31 职场文书
高中军训第一天感言
2014/03/06 职场文书
房地产公司见习自我鉴定
2014/04/28 职场文书
文明美德伴我成长演讲稿
2014/05/12 职场文书
作风建设年度心得体会
2014/10/29 职场文书
小学德育工作总结2015
2015/05/12 职场文书
民事代理词范文
2015/05/25 职场文书
欠条格式范本
2015/07/03 职场文书
安全生产标语口号
2015/12/26 职场文书
python缺失值填充方法示例代码
2022/12/24 Python