一、面向对象简介

  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面向对象(一)的更多相关文章

  1. Python学习-14.Python的输入输出(三)

    在Python中写文件也是得先打开文件的. file=open(r'E:\temp\test.txt','a') file.write('append to file') file.close() 第 ...

  2. Python学习day09 - Python进阶(3)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  3. Python学习day05 - Python基础(3) 格式化输出和基本运算符

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  4. 【python学习-5】面向对象的python

    python是一种面向对象的编程语言,虽然与C++一样,支持面向过程的程序设计,python完全可以使用函数.模块等方式来完成工作,但是当使用python编写一个较大的项目时,则应该考虑使用面向对象的 ...

  5. python学习笔记(7): 面向对象

    class Foo: #类中的函数 def bar(self): #功能阐述 print('Bar') pass def hello(self,name): print('i am %s' %name ...

  6. python学习之python开发环境搭建

    Python简介 Python是一种面向对象.解释型计算机程序设计语言.Python语法简洁而清晰,具有丰富和强大的类库等等众多的特性,这是来自百度百科的介绍,在百度百科还能看到它的更详细的介绍信息, ...

  7. python学习: 优秀Python学习资源收集汇总--转

    Python是一种面向对象.直译式计算机程序设计语言.它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用縮进来定义语句块.与Scheme.Ruby.Perl ...

  8. python学习笔记--python简介

    一.什么是python? python是一种面向对象.解释型的高级程序语言.python具有语法简洁.易于学习.功能强大,可扩展性强,跨平台等诸多特点.1989年开始开发,于1991年发布第一个公开发 ...

  9. Python学习day07 - Python进阶(1) 内置方法

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  10. Python学习笔记—Python基础1 介绍、发展史、安装、基本语法

    第一周学习笔记: 一.Python介绍      1.Python的创始人为吉多·范罗苏姆.1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...

随机推荐

  1. C# winfrom Datagridview表头样式和选中样式

    Griscolor是表格线的颜色 表头的样式修改如下图: 选中某一行的样色设置

  2. CentOS 7 安装Rabbitmq

    第一步也是往往最重要的一步:下载安装包! Rabbitmq地址:https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.7.5 Erla ...

  3. January 01 2017 Week 1st Sunday

    This is a new year. A new beginning. And things will change. 新一年,新开始,新气象. Hey Hey Hey. I can see my ...

  4. Python的getattr(),setattr(),delattr(),hasattr()及类内建__getattr__应用

    @Python的getattr(),setattr(),delattr(),hasattr() 先转一篇博文,参考.最后再给出一个例子 getattr()函数是Python自省的核心函数,具体使用大体 ...

  5. 【[HEOI2014]大工程 】

    可能是虚树板子题了 首先先把虚树建出来,但是这里和那道虚树的入门题不一样,这里所有的询问点都得在虚树里,所以不会存在那种直接不如栈的点 之后我们考虑一下这个三个要求的东西 第一个操作我们需要统计虚树上 ...

  6. 5、Spring-Cloud-声明式调用 Feign(上)

    5.1.写一个 Feign 害户端 新建项目: 依赖: <dependency> <groupId>org.springframework.boot</groupId&g ...

  7. 20145216史婧瑶《Java程序设计》第五次实验报告

    20145216 实验五<Java网络编程> 实验内容 1.掌握Socket程序的编写 2.掌握密码技术的使用 3.设计安全传输系统 实验要求 1.基于Java Socket实现安全传输 ...

  8. 用Maven创建动态Web工程

    前言 maven是一个强大的工具.如果你知道如何使用它,你只要付出最小的努力,但可以获得最大的回报.一般来说,maven可以帮助你管理项目,包括管理依赖库.构建工程等. 下面将通过一个简单的教程来描述 ...

  9. JQ中$(window).load和$(document).ready区别与执行顺序

    JQ中的$(document).ready()大家应该用的非常多,等同于$(function(){}),基本每个JS脚本中都有这个函数的出现有时甚至会出现多个,那么另一个加载函数$(window).l ...

  10. Mac 下 SVN 的使用

    在Windows环境中,我们一般使用TortoiseSVN来搭建svn环境.在Mac环境下,由于Mac自带了svn的服务器端和客户端功能,所以我们可以在不装任何第三方软件的前提下使用svn功能,不过还 ...