day015面向对象(初识)编写及其三大特征

主要内容

·什么是面向过程
·什么是面向对象
·编写面向对象程序
·面向对象的三大特征:封装、继承、多态

一、面向对象和面向过程

1、两者的比较分析

面向过程:

1.以事物的流程为核心,核心是过程“过程”二字,指解决问题的步骤,即先干什么,后干什么;
2.优点:对问题的处理具体化,流程化,编写相对简单;
3.缺点:可扩展性差,对源代码的增删改,会产生全局的变化。

面向对象:

1.一切以对象为中心,不再是事物发展的流程,而是操纵某一个事物的个体(对象)
2.优点:可扩展性强
3.缺点:编程的复杂度高于面向过程

2、如何选用两者,看需求

1.大型项目更适合于面向对象
2.小型脚本程序更适合于面向过程

二、编写面向对象的程序(重点)

1、语法

·1.先创建类,归类,对你要面对的对象归类总结,相当于图纸
·2.使用类创建对象
class 类名(object):  # object是根源,默认的不用写
    def __init__(self, age): # 构造方法,创建对象的时候自动调用这个方法,self是创建的对象本身
        self.age = age   # 存放共同的属性,

    def 方法名(self, 参数):  # 方法,跟函数一样的功能
        方法体

创建对象:
变量(引用,类似句柄) = 类名(参数)

# 访问对象的属性信息
    对象.属性

# 方法的访问:
    对象.方法()

fe: 具体创建示例

# 类名首字母大写.
class Computer:

    # 构造方法. 在创建的对象的时候由系统自动访问这个方法
    # self: 自己. 自身. 类的对象. 当前正在创建的对象
    def __init__(self, pinpai, price, cpu, neicun): # 谁在调用, self就是谁, self 由python自动传递,
        # 此处就是封装
        self.pinpai = pinpai
        self.price = price
        self.cpu = cpu
        self.neicun = neicun

    # 方法. 该类型的对象能够执行哪些操作
    def dayouxi(self, game): # 谁调用的这个方法. self就是谁
        # 我用我的self.pinpai的调用. 利用很牛B的self.cpu来完成吃鸡操作
        # 对方法进行封装
        print("我要打游戏, 我要%s" % game)

c = Computer("微软",25000,"i9","5T") # 创建对象

print(c.price) # 访问对象属性,需打印

c.dayouxi("吃鸡")  # 访问方法,等同于函数的调用

三、面向对象的三大特征

1、封装

把各种内容组合到一起,统一进行存储和使用,这就是封装。

1.对属性封装

def __init__(self, name)
    self.name = name # 对属性的封装

2.对方法的封装

def __init__(self, name)
    self.name = name # 对属性的封装

  # 对方法的封装
def login(self):
    pass
def regist(self):
    pass
def update_psw(self):
    pass

2、继承

继承: 子类自动拥有父类中除了私有内容外的其他所有内容

1.单继承

继承调用的顺序:
子类没有,调用父类的(子无调父)
子类有,先用子类的,不用父类(子有用己)
子类还可以在父类的基础上派生,扩展,说白了,子类的范围可以大于父类的(子拓父业)
fe1: 子无调父
class Niu:
    def da(self):
        print("牛魔王打架很厉害")

class HongHaiEer(Niu):  # 这样写是继承Niu的非私有内容
    pass

hhl = HongHaiEer()

hhl.da()   # 此时调用父类的方法,打印父类的
fe2: 子有用己,子拓父业
class Niu:
    def da(self):
        print("牛魔王打架很厉害")

class HongHaiEer(Niu):
    def da(self):
        print("喷火")

    def fei(self):
        print("风火轮") #  子类在父类的基础上扩展了一些功能. 派生

hhl = HongHaiEer()

hhl.da()  # 此时先调用自己的方法

2、多继承

调用顺序
自己有就用自己的,
没有的就调用父类的,以 class c(fu2, fu1) 靠近的顺序调用,fu2的顺序比fu1的近,
fe: 调用顺序
class Foo1:
    def money(self):
        print("有钱")

class Foo2:
    def play(self):
        print("玩儿")

    def money(self):
        print("没钱")

class Bar(Foo2, Foo1): # MRO c3算法
    pass

b = Bar()
b.money() # Foo2离得近,所以先调用,打印 “没钱”

3、多态

同一个对象. 拥有多种形态 java c++
python自带多态,我们一直在用
好处:超高的扩展性,面向对象的核心和思想
fe: python多态的体现
 在python中多态的效果感受不够明确
class YaoGuai:
    def teng(self):  # 方法封装
        print("妖怪一定会疼")

class ZhiZhuJing(YaoGuai):
    def teng(self):
        print("蜘蛛精很痛")

class HeiXiongJing(YaoGuai):
    def teng(self):
        print("黑熊精也很疼")

class BaiGuJing(YaoGuai):
    def teng(self):
        print("白骨精骨头很疼")

class JinJiaoDaWang(YaoGuai):
    def fangundeteng(self):
        print("爆炸的疼")

class SunWuKong:
    def da(self, yg):  # 封装
        yg.teng() #  只要包含了xxx功能的内容都可以试用. 鸭子模型  ->  多态性

# 西游记开始
swk = SunWuKong()

hxj = HeiXiongJing()
swk.da(hxj)

bgj = BaiGuJing()
swk.da(bgj)

zzj = ZhiZhuJing()
swk.da(zzj)

alex = JinJiaoDaWang()
swk.da(alex)
posted @ 2018-11-06 20:20  一片疏影  阅读(182)  评论(0编辑  收藏  举报