一.今日内容总览(上帝视角,大象自己进冰箱,控制时机)
#转换思想(从面向过程到面向对象) 1.初识面向对象
面向过程:
一切以事物的发展流程为中心.
面向对象:
一切以对象为中心,一切皆为对象,具体的某一个事务就是对象
作用:两者(面向过程&面向对象)是相辅相成的作用 打比方:(开车去新疆)
大象进冰箱
步骤:1.开门,2.装大象,3.关门 面向对象:大象,你进冰箱
此时主语是大象,我操纵的就是大象,此时的大象就是对象 2.类,对象
(1)类:就是图纸,创建对象的第一步,先画图纸,先写类
  对象:对象就是车,通过图纸造出来的具体的东西,通过类来创建对象 (2)类与对象的关系:
A.类是对xxx事物的抽象归类.
写:
__init__(self,参数) 参数一般作为属性设置给对象,对象就是self,对属性的封装 def 方法(self,参数):#方法:第一个参数默认是self,当前类的对象,一般也不起其他的
pass B.对象是xxx类型的一个具体.
创建对象: 类名() (3)创建类:(最实际的东西)
class 类名:
def __init__(self): #初始化方法,又被称为构造方法(这里暂时这样记忆)
self.属性=值
self.属性=值
self.属性=值 def fangfa(self):
方法体(函数体,return) (4)创建对象:
变量=类名() #实例化<=>创建对象 变量.属性 #访问对象的属性信息
变量.方法() #访问类中的方法 3.面向对象和面向过程的对比
如果写一些比较小的程序用面向过程.
程序很复杂,很庞大建议用面向对象.
(前面的东西都是基础,基础就是铺垫,但是那才是核心,现在是进一步升华) 4.面向对象的三大特征
(1)封装
1.对属性的封装(__init__())
self.xxx=xxx 2.对方法和功能的封装 (2)继承
子类自动拥有父类中出了私有内容外的其他所有内容 class Bar(Foo): #Bar对Foo进行了扩展
pass 当出现x是一种y的时候,推荐使用继承关系
python支持多继承,查找顺序:先找离他近的.(就近原则) (3)多态(python原生直接就是多态)
鸭子模型:python(其他很多语言也是)更多的支持的是鸭子模型,只要会嘎嘎叫的就是鸭子

二.今日内容大纲

1.类与对象

2.面向对象和面向过程

3.封装

4.继承

5.多态

三.今日内容详解

1.类与对象

(1)

class Car:  #好习惯类名首字母大写,严格遵守驼峰命名规范
pass
#造车
c=Car() #类名() #创建对象
#出厂之后进行改装
c.color='红颜色' #对象.属性 点:的
c.pai='京A888' #对象.属性
c.pailiang='666L' #排量 print(c.color) #红颜色
print(c.pai) #京A888
print(c.pailiang) #666L c.color='绿颜色' #当属性存在的时候是修改属性信息
#对象.属性=xxxx 设置属性信息
print(c.color) #绿颜色 # 对比:
dic={}
dic['jay']='周杰伦'
print(dic)
dic['jay']='alex'
print(dic) #对象其实内部机制就是字典

(2)

class Car:  #好习惯类名首字母大写,严格遵守驼峰命名规范
pass #造车
c=Car() #类名() #创建对象
#出厂之后进行改装
c.color='红颜色' #对象.属性 点:的 当属性不存在的时候,添加一个属性
c.pai='京A888' #对象.属性
c.pailiang='666L' #排量 c2=Car()
c2.color='蓝色'
c2.pai='京B66666'
c2.pailiang='1.6T' c3=Car()
c3.color='蓝色'
c3.pai='上A99999'
c3.pailiang='3.0L'

(3)

class Car:  #好习惯  类名首字母大写,严格遵守驼峰命名规范
#__init__方法是一个特殊的方法,初始化方法(暂时这么记忆,构造方法)
#在创建对象的时候回自动的调用__init__()
#self就是你创建出来的那个对象
def __init__(self,color,pai,pailiang): #init初始化方法,在创建对象的时候,默认执行这个函数
# print('我是init') #结果:我是init
# print('self=',self) #结果:self= <__main__.Car object at 0x000001B82F177550>
# self.color='红色' #在出厂的时候都是红色
self.color=color
self.pai=pai
self.pailiang=pailiang
# c.color = "红色" # c=Car('红','鲁A111','3.0L') #创建Car类型对象,此时self参数不需要我们管
# print('C=',c) #结果:C= <__main__.Car object at 0x000001B82F177550>
#总结:c和self是同一个对象
c=Car('红色','京A88888','555L') #创建Car类型对象,此时self参数不需要我们管
c2=Car('蓝色','京B66666','1.6T')
print(c.color)
print(c2.color) #self对应一块内存地址

(4)

#车需要跑:动作,功能=>函数
#在类中写的函数=>方法 class Car: #好习惯 类名首字母大写,严格遵守驼峰命名规范
def __init__(self,color,pai,pailiang): #init初始化方法,在创建对象的时候,默认执行这个函数
self.color=color
self.pai=pai
self.pailiang=pailiang # 跑: 动作, 功能 -> 函数
# 在类中写的函数 -> 方法
# self 当前类的对象. def pao(self): #self是自动传递的,不用管它
print('%s,我的车能跑'%self.color)
def jump(self):
print('%s,you jump,I jump'%self.color)
c=Car('红色','京A88888','555L') #创建Car类型对象,此时self参数不需要我们管
c2=Car('蓝色','京B66666','1.6T')
print(c.color)
print(c2.color)
c.pao() #车c跑
c2.pao()
c.jump()

(5)

class Phone:
def __init__(self,color,dianchi,num,price):
self.color=color
self.dianchi=dianchi
self.num=num
self.price=price def call(self,ren):
print('使用我的%s颜色价格%s的电话打个%s'%(self.color,self.price,ren))
def play(self):
print('电话可以打游戏') sj=Phone('黑色','5WmA','','9w欧元')
sj.call('嫂子')
sj.play()

(6)练习1版本

(1)
#创建一个武松,武松可以打老虎,杀嫂子,替天行道
class haohan():
def __init__(self,name,nickname):
self.name=name
self.nickname=nickname
print('好汉%s,绰号%s'%(self.name,self.nickname))
def play(self,ren):
print('%s 可以打老虎,杀嫂子,替天行道'%ren)
hh=haohan('武松','行者')
hh.play('武松')
(2)
#⽤⾯向对象的思维来模拟LOL⾥的盖伦上阵杀敌.
class hero():
def __init__(self,name):
self.name=name
print('英雄是:%s'%(self.name))
def skill(self,Q,W,E,R):
print("Q技能是%s,W技能是%s,E技能是%s,R技能是%s"%(Q,W,E,R))
# print("名字%s,Q技能是%s,W技能是%s,E技能是%s,R技能是%s"%(self,Q,W,E,R))
h=hero('盖伦')
h.skill('快溜','转子','双倍打击','大保健') # hero.skill('盖伦','快溜','转子','双倍打击','大保健')
# hero.skill('艾希','快溜','转子','双倍打击','大保健')
(3)#编写和尚类. ⾃⼰⾃由发挥和尚有哪些属性和⽅法. class monk():
def __init__(self,name,home,fahao):
self.name=name
self.home=home
self.fahao=fahao
def action(self,ren):
print('%s,吃狗肉,敲木鱼,念经,吃斋'%(ren))
m=monk('济公','灵隐寺','道济')
m.action('济公') (4)
#用面向对象的思维来完成用户登录
class user_login():
def __init__(self,name,pwd):
self.name=name
self.pwd=pwd
def login(self):
if self.name=='alex'and self.pwd=='ab':
print('登录成功')
else:
print('登录失败')
ul=user_login('alex','ab')
ul.login()

2版本

#类就是对属性和动作的封装
'''
1. 创建⼀个武松. 武松可以打老虎, 杀嫂⼦, 替天⾏道
2. ⽤⾯向对象的思维来模拟LOL⾥的盖伦上阵杀敌.
3. 编写和尚类. ⾃⼰⾃由发挥和尚有哪些属性和⽅法
4. ⽤⾯向对象的思维来完成⽤户登录.
'''
#属性和方法
(1)
class Person:
#属性
def __init__(self,waihao,name,address):
self.waihao=waihao
self.name=name
self.address=address
#动作
def dalaohu(self):
print("%s%s%s打老虎"%(self.waihao,self.name,self.address)) def shasaozi(self):
print('这个人,喜欢杀嫂子') def titianxingdao(self):
print('替天行道') ws=Person('行者','武松','景阳县')
ws.dalaohu()
ws.shasaozi()
ws.shasaozi()
ws.titianxingdao() (2)
class Hero:
def __init__(self,waihao,name,story):
self.waihao=waihao
self.name=name
self.story=story def q(self):
print('拎着宝剑嗷嗷跑')
def w(self):
print('护盾')
def e(self):
print('电风扇')
def r(self):
print('大保健') gw=Hero('德玛西亚之力','盖伦','500年前盖伦拿一个破棍子捅破玉皇大帝...')
gw.w()
gw.e()
gw.q()
gw.r() (3)
class HeShang:
def __init__(self, fh, name, miao):
self.fahao = fh
self.name = name
self.miao = miao def nianjing(self):
print("和尚会念经") def huayuan(self):
print("和尚会化缘") lzs = HeShang("花和尚", "鲁智深", "梁山水庙") lzs.nianjing()
lzs.huayuan()
(4)
#用户登录的问题,逻辑是活的 #我的版本:把所有的逻辑都写在类中
class User:
def __init__(self,username,password):
self.username=username
self.password=password
def login(self):
uname=input('请输入你的用户名')
upwd=input('请输入你的密码') if uname==self.username and upwd==self.password:
print("登录成功")
else:
print("登录失败") u = User("alex", "")
u.login()

2.面向对象和面向过程

(1)

#大象装冰箱
# print('开门')
# print('装大象')
# print('关门')

(2)

#脚本,此时代码是最简单的,不需要构思整个程序的概况

(3)

函数式编程,比脚本麻烦,对功能有了'概况'

(4)

def kai():
print('开门')
def zhuang():
print('装大象')
def guan():
print('关门')
kai()
zhuang()
guan()
第一回合
脚本胜
函数侧重的是功能
面向对象侧重的是:归类

(5)

PK2

# PK2!!!!!!!!
#小猪佩奇,使用嘴巴嘟嘟技能攻击 超人
#小猪佩奇,使用嘴巴嘟嘟技能攻击 蝙蝠侠
#小猪佩奇,使用嘴巴嘟嘟技能攻击 蜘蛛侠 #面向过程:代码非常的冗余,尤其是参数
def fight_superman(name,jineng):
print('%s使用%s攻击超人'%(name,jineng))
def fight_spiderman(name,jineng):
print('%s使用%s攻击蜘蛛侠'%(name,jineng))
def fight_batman(name, jineng):
print('%s使用%s攻击蝙蝠侠' % (name, jineng)) fight_superman('小猪佩奇','嘴巴嘟嘟')
fight_spiderman('小猪佩奇','嘴巴嘟嘟')
fight_batman('小猪佩奇','嘴巴嘟嘟') class Pig:
def __init__(self,name,jineng):
self.name=name
self.jineng=jineng def fight_superman(self):
print('%s使用%s攻击超人' % (self.name, self.jineng)) def fight_spiderman(self):
print('%s使用%s攻击蜘蛛侠' % (self.name, self.jineng)) def fight_batman(self):
print('%s使用%s攻击蝙蝠侠' % (self.name, self.jineng)) #不需要像原来一样传递一样的参数了
#面向对象的程序:结果相对清晰.缺点:代码量比原来大,上手太难
pg=Pig('小猪佩奇','嘴巴嘟嘟')
pg.fight_batman()
pg.fight_superman()
pg.fight_spiderman() #学完之后,再学java才真正明白

(6)

#如果写一个定时任务,半夜12点,给老板发送财务报表(一张图)
# def send_email(address,name,title,content):
# print('发送邮件')
# def send_chat(address,name,title,content):
# print('发送短信')
# def send_wechat(address,name,title,content):
# print('发送微信')
# def send_dd(address,name,title,content):
# print('发送钉钉')
# def send_oa(address,name,title,content):
# print('发送OA') # send_dd()
# send_email()
# send_oa()
# send_wechat()
# send_chat()
#
#
# class Messager:
# def __init__(self,name,title,content):
# self.name=name
# self.title=title
# self.content=content
#
# def send_email(address, name, title, content):
# print('发送邮件')
#
# def send_wechat(address, name, title, content):
# print('发送微信')
#
# def send_chat(address, name, title, content):
# print('发送短信')
#
# def send_dd(address, name, title, content):
# print('发送钉钉')
#
# def send_oa(address, name, title, content):
# print('发送OA') #用面向对象就比面向过程稍微好一些
#可维护性比原来好 #python同时支持面向对象和面向过程:
#面向过程:应用程序相对比较小,不需要大规模的设计
#面向对象:程序非常大,项目管理,维护成本很高,此时更适合用面向对象(结构) #tornado
#java:纯面向对象 =>可以把一个微小项目,做成巨大项目

3.封装

1.对属性的封装
2.对功能的封装
3.模块 (在一个模块中封装了很多类)
4.包
(1)
class Student:  #封装需要的就可以了
def __init__(self,num,name,clazz):
self.num=num
self.name=name
self.clazz=clazz
# print() stu=Student('','曹宝宝','三年级二班') #把多个信息(值),保存在一个对象里面
stu2=Student('','王迪','三年级一班') def kill_stu(s): #这是就是对属性进行封装
print('杀%s'%(s.name))
kill_stu(stu2)

(2)

class Game:
def login(self):
print('登录') def recharge(self):
print('充钱') def uninstall(self):
print('卸载')#冲多了就卸了 def zhaoduixiang(self):
print('找对象')
g=Game() #强行安装一个主语
g.recharge()

(3)

class Game1:
def recharge(self):
print("充钱")
def uninstall(self):
print("卸载") class Game2:
def recharge(self):
print("充钱")
def uninstall(self):
print("卸载") g = Game2()
g.uninstall()

4.继承

子类自动拥有父类中除了私有内容外的其他所有内容
老婆不能继承,年龄不能继承(这些都属于'私有内容') 王思聪(熊猫tv)=>王健林(年龄)
getmoney 拿钱
继承的目的:对父类进行扩展

(1)

class Foo:
def getMoney(self):
print('拿钱') class Bar(Foo):
pass
b=Bar()
b.getMoney() #此时调用的是父类中的方法 #当出现xxx是一种yyy类型的东西,可以使用继承关系
#猫是一种动物

(2)

class Animal:
def dong(self):
print('动物会动,雇佣')
class Cat(Animal): #子类其实是对父类的一种扩展
def catchMouse(self):
print('猫很皮,抓老鼠') c=Cat()
c.dong()
c.catchMouse() a=Animal() #父类的对象不能执行子类中的功能
a.dong()
a.catchMouse() #父类不能对子类的方法操作,这句话会报错
#创建的是动物,动物不能执行抓老鼠

(3)

class Animal:
def dong(self):
print('动物会动,雇佣')
class Cat(Animal): #子类其实是对父类的一种扩展
def dong(self): #子类中写了和父类一模一样的方法,这个叫方法的覆盖,重写
print('猫上蹿下跳') def catchMouse(self):
print('猫很皮,抓老鼠') c=Cat() #创建的是猫
c.dong() #类中的方法的查询顺序,先找自己,然后再找父类

(4)

#python支持多继承

class Foo1:
def getMoney(self):
print('给钱,给你个大嘴巴子')
class Foo2:
def getMoney(self):
print('给多点儿') def play(self):
print('玩儿')
class Bar(Foo1,Foo2): #离当前类最近的是亲爹,后面的是干爹
pass
a=Bar() #就近原则,MRO的C3算法
a.getMoney() #Foo2里的

5.多态

多态性:同一个对象,多种形态
python支持的是鸭子类型,只要会嘎嘎叫的东西就是鸭子
(哪怕不是鸭子//哪怕是鸭子,不会叫,也不行,也不能叫鸭子) 为了程序能够正常执行,本来需要传递进来一只鸭子,但是我只需要传递一个会嘎嘎叫的东西就可以了

(1)归一化设计

class Animal(object):
def chi(self):
print('会吃')
class GlodenMonkey(Animal):
def chi(self):
print('用手拿着吃,五花八门')
class Tiger(Animal):
def chi(self):
print('老虎吃肉')
class Elephant(Animal):
def chi(self):
print('大象吃香蕉')
class qie(Animal):
def chi(self):
print('企鹅吃人民币') #以下代码是饲养员
#优点:超强的可扩展性.面向对象的核心就是多态 def wei_animal(ani): #传进来的东西要会吃就行
ani.chi() #动物园
t=Tiger()
m=GlodenMonkey()
e=Elephant() wei_animal(t)
wei_animal(m)
wei_animal(e)
a=188
def cul(n):
print(n) #python中万事万物都是对象,object(对象)
cul(a)
cul('')

作业:???(记得补充)

巨蟒python全栈开发-第16天 核能来袭-初识面向对象的更多相关文章

  1. 巨蟒python全栈开发-第20天 核能来袭-约束 异常处理 MD5 日志处理

    一.今日主要内容 1.类的约束(对下面人的代码进行限制;项目经理的必备技能,要想走的长远) (1)写一个父类,父类中的某个方法要抛出一个异常 NotImplementedError(重点) (2)抽象 ...

  2. 巨蟒python全栈开发-第17天 核能来袭-成员

    一.今日主要内容 1.成员 在类中你能写的所有内容都是类的成员 2.变量 (1)实例变量:昨天写的就是实例变量,由对象去访问的变量. (2)类变量(静态变量):此时,这个变量属于类,但是对象也可以访问 ...

  3. 巨蟒python全栈开发-第19天 核能来袭-反射

    一.今日主要内容 1.isinstance,type,issubclass A.isinstance: 判断你给对象是否是xx类型的. (向上判断) B.type: 返回xxx对象的数据类型 C.is ...

  4. 巨蟒python全栈开发-第18天 核能来袭-类和类之间的关系

    一.今日主要内容: 1.类与类之间的关系 在我们的世界中事物和事物之间总会有一些联系. 在面向对象中,类和类之间也可以产生相关的关系 (1)依赖关系 执行某个动作(方法)的时候,需要xxx来帮助你完成 ...

  5. python 全栈开发,Day19(组合,组合实例,初识面向对象小结,初识继承)

    一.组合 表示的一种什么有什么的关系 先来说一下,__init__的作用 class Dog: def __init__(self, name, kind, hp, ad): self.name = ...

  6. python全栈开发从入门到放弃之初识面向对象

    面向过程 VS 面向对象 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的复 ...

  7. 巨蟒python全栈开发linux之centos1

    1.linux服务器介绍 2.linux介绍 3.linux命令学习 linux默认有一个超级用户root,就是linux的皇帝 注意:我的用户名是s18,密码是centos 我们输入密码,点击解锁( ...

  8. 巨蟒python全栈开发linux之centos3

    1.作业讲解 (1)递归创建文件夹/tmp/oldboy/python/{alex,wusir,nvshen,xiaofeng} 下面中的路径没有必要换,在哪里创建都行,根目录下或者tmp目录下或者其 ...

  9. 巨蟒python全栈开发django5:组件&&CBV&FBV&&装饰器&&ORM增删改查

    内容回顾: 补充反向解析 Html:{% url ‘别名’ 参数 %} Views:reverse(‘别名’,args=(参数,)) 模板渲染 变量 {{ 变量名 }} 逻辑相关 {% %} 过滤器: ...

随机推荐

  1. C#面试题汇总2

    http://www.cnblogs.com/wangjisi/archive/2010/06/14/1758347.html 用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及 ...

  2. SSH整合简单例子

    说明:简单SSH整合,struts版本2.3.32,spring版本3.2.9,hibernate版本3.6.10 一.开发步骤 1 引jar包,创建用户library.使用的包和之前博文相同,可以参 ...

  3. php get_called_class()函数与get_class函数的区别

    get_class (): 获取当前调用方法的类名: get_called_class():获取静态绑定后的类名: 有例为证: class Foo{ public function test(){ v ...

  4. 集成讯飞听写iOS sdk到unity遇到的问题:weak成员和strong成员

    在unity里集成讯飞语音听写iOS sdk的过程中,遇到一个问题,官方的demo中可以将多次onResults回调返回的结果累积拼接起来组成一个完整的结果,而我集成过来以后就不能累积了,只拿到最后一 ...

  5. unity5, animator state machine, 无条件transition实现播放动画序列

    今天遇到这样一个需求,我有一个名为happy的animation clip和一个名为speak的animation clip.想实现当主角胜利后播放动序列: happy->speak->h ...

  6. 有关linux磁盘分区优化

    Linux中几个重要的目录,这几个目录在ubuntu安装的硬盘分区时,可选择性的特别分区,进行挂载./usr 文件系统中一般不改变的文件,如库,程序./var 文件系统包含会改变的文件./home 文 ...

  7. atitit.userService 用户系统设计 v5 q330

    atitit.userService 用户系统设计 v5 q330 1. 新特性1 2. Admin  login1 3. 用户注册登录2 3.1. <!-- 会员注册使用 -->  商家 ...

  8. atitit.  web组件化原理与设计

    atitit.  web组件化原理与设计 1. Web Components提供了一种组件化的推荐方式,具体来说,就是:1 2. 组件化的本质目的并不一定是要为了可复用,而是提升可维护性. 不具有复用 ...

  9. atitit.eclipse有多少api  扩展点,以及扩展点的设计

    atitit.eclipse有多少api  扩展点,以及扩展点的设计 不赞成使用的.作废的以及内部的扩展点 [扩展]页显示了几个你不应该在你的插件中使用的扩展点.在附表C.1的[描述]栏中,我们使用如 ...

  10. 第一个EJB示例

    FirstEJB2.0.zip Eclipse + JBoss 5.1 Ejb3Example.zip Eclipse + JBoss 7.1 注意点: 1. jboss 增加用户: D:\DevPr ...