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中global与nonlocal比较
Nov 21 Python
在类Unix系统上开始Python3编程入门
Aug 20 Python
Python实现文件复制删除
Apr 19 Python
Python3安装Scrapy的方法步骤
Nov 23 Python
python实现求最长回文子串长度
Jan 22 Python
使用Python进行AES加密和解密的示例代码
Feb 02 Python
Python 画出来六维图
Jul 26 Python
如何在Cloud Studio上执行Python代码?
Aug 09 Python
Python编程快速上手——强口令检测算法案例分析
Feb 29 Python
浅谈keras中Dropout在预测过程中是否仍要起作用
Jul 09 Python
python字符串拼接+和join的区别详解
Dec 03 Python
python中super()函数的理解与基本使用
Aug 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
php中使用parse_url()对网址进行解析的实现代码(parse_url详解)
2012/01/03 PHP
php使用curl检测网页是否被百度收录的示例分享
2014/01/31 PHP
Laravel中使用FormRequest进行表单验证方法及问题汇总
2016/06/19 PHP
php使用正则表达式去掉html中的注释方法
2016/11/03 PHP
ThinkPHP5 验证器的具体使用
2018/05/31 PHP
用于判断用户注册时,密码强度的JS代码
2009/01/01 Javascript
JavaScript 无符号右移运算符
2009/04/17 Javascript
javascript 读取图片文件的大小
2009/06/25 Javascript
jquery删除提示框弹出是否删除对话框
2014/01/07 Javascript
js利用prototype调用Array的slice方法示例
2014/06/09 Javascript
Nodejs实现的一个简单udp广播服务器、客户端
2014/09/25 NodeJs
Jquery判断radio、selelct、checkbox是否选中及获取选中值方法总结
2015/04/15 Javascript
jQuery动态添加可拖动元素完整实例(附demo源码下载)
2016/06/21 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
2016/06/29 Javascript
JS传值出现中文参数乱码的解决方法
2016/06/30 Javascript
jQuery过滤选择器用法示例
2016/09/12 Javascript
AngularJS 2.0入门权威指南
2016/10/08 Javascript
通过构造函数实例化对象的方法
2017/06/28 Javascript
Vue中建立全局引用或者全局命令的方法
2017/08/21 Javascript
JavaScript实现各种排序的代码详解
2017/08/28 Javascript
js对象数组和对象的使用实例详解
2019/08/27 Javascript
微信小程序如何获取地址
2019/12/24 Javascript
Python中实现常量(Const)功能
2015/01/28 Python
在Python中处理字符串之isdigit()方法的使用
2015/05/18 Python
pycharm的console输入实现换行的方法
2019/01/16 Python
详解Python 4.0 预计推出的新功能
2019/07/26 Python
Python 导入文件过程图解
2019/10/15 Python
使用tensorflow显示pb模型的所有网络结点方式
2020/01/23 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
2020/06/22 Python
德国自行车商店:Tretwerk
2019/06/21 全球购物
Myprotein亚太地区:欧洲第一在线运动营养品牌
2020/12/20 全球购物
标准自荐信范文
2014/01/29 职场文书
荆州古城导游词
2015/02/06 职场文书
2016年清明节网上祭英烈活动总结
2016/04/01 职场文书
pytorch 如何把图像数据集进行划分成train,test和val
2021/05/31 Python
MySQL系列之十 MySQL事务隔离实现并发控制
2021/07/02 MySQL