Python学习:14.Python面向对象(一)
一、面向对象简介
Python设计之初,就是一门面向对象的语言,在Python中一切皆对象,而且在Python中创建一个对象也很简单,今天我们就来学习一下Python的面向对象的知识。
二、两种编程方式
在C#、Java中,只能使用面向对象编程,在Ruby、Python中可以使用函数编程以及面向对象进行编程。
函数式编程
def fetch(backend):
pass
def add_record(backend,record):
pass
fetch("www.oldboy.org")
add_record("www.oldboy.org",xxxxx)
面向对象编程
class Oldboy:#类,用来封装几个函数 def fetch(self,backend):#self是python内部传的,用户我们传值时
pass #传的第一个参数直接给backend def add_record(self,backend,record):
pass obj = Oldboy()
obj.fetch()
函数在类的外面就叫做函数,在类的里面就叫做方法,面向对象的情况下想要执行函数时需要根据这个类创建一个对象,通过对象访问函数。
一般函数式编程的函数为模块的成员,而面向对象编程,类是模块的成员,函数是类的成员。
面向对象的程序设计的核心是对象(上帝式思维),要理解对象为何物,必须把自己当成上帝,上帝眼里世间存在的万物皆为对象,不存在的也可以创造出来。对象是特征和技能的结合,其中特征和技能分别对应对象的数据属性和方法属性。
优点是:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。
缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。于是我们经常看到一个游戏人某一参数的修改极有可能导致阴霸的技能出现,一刀砍死3个人,这个游戏就失去平衡。
三、面向对象深度解析
1.关于self的解析
2.封装
class Oldboy: def fetch(self):
print(self.backend)#因为参数self传的值为对象obj1,所以可以用self代替obj1 def add_record(self,record):
pass
obj1 = Oldboy()
obj1.backend = "alexsel"#这个参数,和obj1一起被存入内存
#封装的非主流的方式
obj1.fetch()#由于backend和obj1一起存入内存,所以不用再吧backend传过去,直接
#在函数里用self.backend使用 obj2 = Oldboy()
obj2.backend = "ALEXSEL"
obj2.fetch()
这里也显示出了self的作用,self可以标识对象,由于给两个对象传入的参数输不同,调用类的方法的时候,输出的内容就不同,这就是self的功能。
应用:
当有几个函数要传的参数相同时,封装比较简便
3.构造方法__init__
当使用类创建对象的时候(obj = Foo()),默认执行__init__方法
class Foo:
def __init__(self, bk): ##这个self为创建的对象,创建对象时默认执行__init__
print("init") ##所以可把需要多次传的参数在这里创建,代替上面那个
self.name = "alex" ##非主流的方法
self.favor = bk
print(self.favor) # 创建对象,实例,并将“xxx”封装到对象里
obj1 = Foo("xxx") # 创建对象时,类里就会执行__init__方法(函数),这个xxx就传入到__init__的bk参数中
obj2 = Foo("sss") 输出结果:
init
xxx
init
sss
使用场景:当同一类型的的方法具有相同的参数时,直接封装到对象即可。
使用场景:把类当成模板,创建多个对象(对象内封装的数据可以不一样)。
四、上手练习
针对刚才了解的知识,我们进行一个简单的练习,输出同样的结果下,不同的两种写法,熟悉类中方法和属性的使用。
写法一:
class activity:
def __init__(self,name,age,gender):
self.FlyAnAeroplane = "{:s},{:s},{:s},去开飞机".format(name,age,gender)
self.GoToSchool = "{:s},{:s},{:s},去学校".format(name,age,gender)
self.Farm = "{:s},{:s},{:s},去种田".format(name,age,gender)
def FlyAnAeroplane_one(self):
print(self.FlyAnAeroplane)
def GoToSchool_one(self):
print(self.GoToSchool)
def Farm_one(self):
print(self.Farm) obj = activity("alexsel","","男")
obj.FlyAnAeroplane_one()
obj.GoToSchool_one()
obj.Farm_one()
obj2 = activity("eric","","男")
obj2.FlyAnAeroplane_one()
obj2.GoToSchool_one()
obj2.Farm_one() 输出结果:
alexsel,10,男,去开飞机
alexsel,10,男,去学校
alexsel,10,男,去种田
eric,60,男,去开飞机
eric,60,男,去学校
eric,60,男,去种田
写法二:
class Foo:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender def kaifeiji(self):
print("%s,%s岁,%s,去开飞机" % (self.name, self.age, self.gender)) def quxuexiao(self):
print("%s,%s岁,%s,去学校" % (self.name, self.age, self.gender)) def quzhongtian(self):
print("%s,%s岁,%s,去种田" % (self.name, self.age, self.gender)) alexsel = Foo('alexsel', 10, '男')
alexsel.kaifeiji()
alexsel.quxuexiao()
alexsel.quzhongtian() eric = Foo('eric', 90, '男')
eric.kaifeiji()
eric.quxuexiao()
eric.quzhongtian() 输出结果:
alexsel,10岁,男,去开飞机
alexsel,10岁,男,去学校
alexsel,10岁,男,去种田
eric,90岁,男,去开飞机
eric,90岁,男,去学校
eric,90岁,男,去种田
五、项目练习
在写这个项目之前,我们首先学习一下pickel模块。
pickle可以将任何数据类型序列化,pickle只能在python中使用,pickle模块用于将内存中的python对象序列化成字节流,并可以写入任何类似文件对象中;它也可以根据序列化的字节流进行反序列化,将字节流还原为内存中的对象。
pickle使用dump方法将内存对象序列化:
import pickle li = list(range(,))
dbfile = open('pickle_list', 'wb') #必须以2进制打开文件,否则pickle无法将对象序列化只文件
pickle.dump(li, dbfile)
dbfile.close()
以上代码即将list对象li序列化至文件“pickle_list"中,下次再次运行时,可以通过pickle的load方法恢复list对象:
import pickle dbfile = open('pickle_list', 'rb')
li = pickle.load(dbfile)
dbfile.close()
开始项目练习
import pickle class Person:
def __init__(self,name,age,weight):
self.Name = name
self.Age = age
self.Weight = weight def eat(self):
self.Weight = self.Weight + 2 #每次吃饭,体重加1 def fitness(self):
self.Weight = self.Weight - 1 #每次健身,体重减1 xiaoming = pickle.load(open("fitnessgame.obb","rb"))
if xiaoming: #判断是否有小明这个对象,没有创建小明对象
print(xiaoming.Weight)
xiaoming.fitness()
xiaoming.fitness()
xiaoming.fitness()
print(xiaoming.Weight)
pickle.dump(xiaoming,open("fitnessgame.obb","wb"))
else:
xiaoming = Person("小明","10岁",200)
xiaoming.fitness()
xiaoming.eat()
xiaoming.eat()
xiaoming.eat()
xiaoming.eat()
print(xiaoming.Weight)
pickle.dump(xiaoming,open("fitnessgame.obb","wb"))
明天我们接着讲面向对象,明天继续讲面向对象中的继承。
Python学习:14.Python面向对象(一)的更多相关文章
- Python学习-14.Python的输入输出(三)
在Python中写文件也是得先打开文件的. file=open(r'E:\temp\test.txt','a') file.write('append to file') file.close() 第 ...
- Python学习day09 - Python进阶(3)
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- Python学习day05 - Python基础(3) 格式化输出和基本运算符
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- 【python学习-5】面向对象的python
python是一种面向对象的编程语言,虽然与C++一样,支持面向过程的程序设计,python完全可以使用函数.模块等方式来完成工作,但是当使用python编写一个较大的项目时,则应该考虑使用面向对象的 ...
- python学习笔记(7): 面向对象
class Foo: #类中的函数 def bar(self): #功能阐述 print('Bar') pass def hello(self,name): print('i am %s' %name ...
- python学习之python开发环境搭建
Python简介 Python是一种面向对象.解释型计算机程序设计语言.Python语法简洁而清晰,具有丰富和强大的类库等等众多的特性,这是来自百度百科的介绍,在百度百科还能看到它的更详细的介绍信息, ...
- python学习: 优秀Python学习资源收集汇总--转
Python是一种面向对象.直译式计算机程序设计语言.它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用縮进来定义语句块.与Scheme.Ruby.Perl ...
- python学习笔记--python简介
一.什么是python? python是一种面向对象.解释型的高级程序语言.python具有语法简洁.易于学习.功能强大,可扩展性强,跨平台等诸多特点.1989年开始开发,于1991年发布第一个公开发 ...
- Python学习day07 - Python进阶(1) 内置方法
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- Python学习笔记—Python基础1 介绍、发展史、安装、基本语法
第一周学习笔记: 一.Python介绍 1.Python的创始人为吉多·范罗苏姆.1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...
随机推荐
- nginx部署及简单优化
研究nginx优化时反复安装清理nginx,为方便做了一个简单部署脚本,用的最新稳定版1.14.0,默认路径,加入systemd系统进程管理中,可以通过systemd管理nginx的启动.终止.重载. ...
- 打通版微社区(5):部署DZ3.2
参考官方帖子http://www.discuz.net/thread-3258186-1-1.html 这是第三方的帖子http://www.discuz.net/thread-3199850-1- ...
- C# 数据类型转换 显式转型、隐式转型、强制转型
C# 的类型转换有 显式转型 和 隐式转型 两种方式. 显式转型:有可能引发异常.精确度丢失及其他问题的转换方式.需要使用手段进行转换操作. 隐式转型:不会改变原有数据精确度.引发异常,不会发生任何问 ...
- windows10 彻底卸载 Docker 和 DockerNAT
删除docker程序 记事本新建脚本文件 a.ps1,内容如下: $ErrorActionPreference = "SilentlyContinue" kill -force - ...
- 020.2.2 runtime类
基本不用,简单看一下就行了 1.属于单例的一个实例,可以通过getRuntime()获取对象Runtime r = Runtime.getRuntime();r.exec("winmine. ...
- oracle imp 报12154错误解决办法
imp test/test@orcl file=/backup.dmp full=y --报错 imp test/test@127.0.0.1/orcl file=/backup.dmp full ...
- TP,TN,FP,FN
一张图搞定~~~ [转]https://blog.csdn.net/u011956147/article/details/78967145
- DP入门——01背包 & 完全背包
01背包: 采药: https://www.luogu.org/problemnew/show/P1048 #include <iostream> #include <algorit ...
- 6、Web Service-拦截器
1.为什么CXF设置拦截器 为了在webservice请求过程中,能动态操作请求和响应数据, CXF设计了拦截器.拦截器分类 1.按所处的位置分:服务器端拦截器,客户端拦截器 2.按消息的方向分:入拦 ...
- Python 模块化 from .. import 语句资源搜索顺序 (三)
接着上一篇文章最后的import子句资源搜索顺序,我们来写几个例子了解下. 例一. #test1.py x = 123 #test.py import test1 print(dir()) print ...