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语言 ...
随机推荐
- web前端与后端的理解区分
要了解web前后端的区别,首先必须得清楚什么是web前端和web后端. 首先:web的本意是蜘蛛网和网的意思,在网页设计中我们称为网页的意思.现广泛译作网络.互联网等技术领域.表现为三种形式,即超文本 ...
- [翻译] ATTutorialController
ATTutorialController https://github.com/AfonsoTsukamoto/ATTutorialController A simple to use tutoria ...
- bmp制作自定义字体(cocostudio使用)
工具需求:bmpfont 1.步骤 (1)制作 * 把自己的字体放到一个txt文件中,写个脚本抽离出来, 重复了没有关系 * Edit->Select chars from fils(注意:Ed ...
- 无法用Put方式请求发布在IIS中的WebAPI
WebApi程序发布到IIS上后,无法使用Put的方式进行请求,错误信息如下: 原因和解决方案: 在IIS中默认不支持Put请求和Delete请求,因为IIS中注册的Web ...
- yum安装工具的理解
在安装gtk+编译环境的过程中,你会发现,RPM软件包之间的依赖关系非常复杂.在实际管理过程中,这种依赖关系可能会更加复杂.因此非常有必要寻找一种自动化安装工具,让安装工具自己处理这些关系复杂的依赖关 ...
- angularJs的run方法操作
省掉了控制器 <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv= ...
- BZOJ3566:[SHOI2014]概率充电器(树形DP,概率期望)
Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器: “采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决定!SHOI 概率充电器, ...
- 5、Spring Cloud-声明式调用 Feign(下)
5.5.在Feign中使用HttpClient和OkhHttp Feign 中.Client 是一个非常重要的组件, Feign 最终发送 Request 请求以及接收 Response响应都是由 C ...
- 架构图以及vue的简介
架构图 前后端分离总架构图 前端架构设计图 MVVM架构模式 MVVM的简介 MVVM 由 Model,View,ViewModel 三部分构成,Model 层代表数据模型,也可以在Model中定义数 ...
- Spring(十五)之声明式事务
声明式事务管理方法允许你在配置的帮助下而不是源代码硬编程来管理事务.这意味着你可以将事务管理从事务代码中隔离出来.你可以只使用注释或基于配置的 XML 来管理事务. bean 配置会指定事务型方法.下 ...