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语言 ...
随机推荐
- rabbitmq集群配置
原文地址:http://www.360doc.com/content/14/0911/17/15077656_408713893.shtml 按照文章中的方式成功建立了两台机器的集群. 但文章中加入集 ...
- Java Spring中@Query中使用JPQL LIKE 写法
两种方式 // 一 public List<TestEntity> searchByJpql(){ String jpql = "select k from TestEntity ...
- HTML 教程
HTML5 标准 超文本标记语言(英语:HyperText Markup Language,简称:HTML) 是一种用于创建网页的标准标记语言. 您可以使用 HTML 来建立自己的 WEB 站点,HT ...
- Python安装第三方库 xlrd 和 xlwt 。处理Excel表格
1. 到 https://pypi.python.org/simple/xlwt/ 和https://pypi.python.org/simple/xlrt/ 下载 xlrd 和 xlwt ...
- webview综述
nWebView 是webkit最核心的一个view,WebView管理WebFrameView和WebFrame之间的交互,一个WebView对象绑定一个window,并且要求MainFrame加载 ...
- 【Java虚拟机结构(第1部分)数据类型】摘要
<Java虚拟机规范(Java SE 7版)>作者:Tim Lindholm.Frank Yellin.Gilad Bracha.Alex Buckley 摘要:第二章 Java虚拟机结构 ...
- 【HNOI2009】梦幻布丁
题目描述 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. 输入输出格式 输入格式 第一 ...
- gulp基础使用及进阶
提示:路径中不允许出现中文,否则scss编译会出错,大概. 按照惯例,先检查一下Node.js.npm(cnpm).gulp的版本号 1.新建package.json 我们可以通过手动新建这个配置文件 ...
- 【Vue】安装(NPM 方法)
[Vue2.0 新手完全填坑攻略——从环境搭建到发布]http://www.jianshu.com/p/5ba253651c3b 1.在用 Vue.js 构建大型应用时推荐使用 NPM 安装 2.Vu ...
- laravel 多态映射(打赏为例)
迁移: public function up() { Schema::create('rewards', function (Blueprint $table) { $table->increm ...