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中使用Boolean操作符做真值测试实例
Jan 30 Python
python输出指定月份日历的方法
Apr 23 Python
python字符类型的一些方法小结
May 16 Python
python开发准备工作之配置虚拟环境(非常重要)
Feb 11 Python
Python中six模块基础用法
Dec 08 Python
Python OrderedDict字典排序方法详解
May 21 Python
python如何实现读取并显示图片(不需要图形界面)
Jul 08 Python
Pycharm自带Git实现版本管理的方法步骤
Sep 18 Python
详解Scrapy Redis入门实战
Nov 18 Python
Python爬虫Scrapy框架CrawlSpider原理及使用案例
Nov 20 Python
Pandas之缺失数据的实现
Jan 06 Python
python+opencv实现车道线检测
Feb 19 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实现RSA加密类实例
2015/03/26 PHP
ThinkPHP下表单令牌错误与解决方法分析
2017/05/20 PHP
PHP getName()函数讲解
2019/02/03 PHP
php操作redis常见方法示例【key与value操作】
2020/04/14 PHP
PHP变量的作用范围实例讲解
2020/12/22 PHP
基于jquery的表头固定的若干方法
2011/01/27 Javascript
JavaScript使用addEventListener添加事件监听用法实例
2015/06/01 Javascript
jQuery+HTML5美女瀑布流布局实现方法
2015/09/21 Javascript
快速学习jQuery插件 Cookie插件使用方法
2015/12/01 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
2015/12/13 Javascript
浅析JS获取url中的参数实例代码
2016/06/14 Javascript
jquery插件uploadify多图上传功能实现代码
2016/08/12 Javascript
vue引入swiper插件的使用实例
2017/07/19 Javascript
Angular项目从新建、打包到nginx部署全过程记录
2017/12/09 Javascript
vue实现倒计时获取验证码效果
2020/04/17 Javascript
使用Python设置tmpfs来加速项目的教程
2015/04/17 Python
Python文件读取的3种方法及路径转义
2015/06/21 Python
Python list操作用法总结
2015/11/10 Python
python Crypto模块的安装与使用方法
2017/12/21 Python
python实现字符串中字符分类及个数统计
2018/09/28 Python
使用Python监视指定目录下文件变更的方法
2018/10/15 Python
python实现移位加密和解密
2019/03/22 Python
Python实现socket非阻塞通讯功能示例
2019/11/06 Python
Python pip 常用命令汇总
2020/10/19 Python
python SOCKET编程基础入门
2021/02/27 Python
HTML5 video视频字幕的使用和制作方法
2018/05/03 HTML / CSS
STAY JAPAN台湾:预订日本民宿
2018/07/22 全球购物
澳大利亚在线消费电子产品商店:TobyDeals
2020/01/05 全球购物
Stührling手表官方网站:男女高品质时尚手表的领先零售商
2021/01/07 全球购物
描述RIP和OSPF区别以及特点
2015/01/17 面试题
2015年乡镇扶贫工作总结
2015/04/08 职场文书
红色经典电影观后感
2015/06/18 职场文书
2015年大学组织委员个人工作总结
2015/10/23 职场文书
2016年大学生党员承诺书
2016/03/24 职场文书
python生成随机数、随机字符、随机字符串
2021/04/06 Python
vue使用节流函数的踩坑实例指南
2021/05/20 Vue.js