Python入门-初始面向对象

  之前我们代码基本上都是面向过程的,今天我们就来初始一下python中一个重要的内容:面向对象

一.面向对象和面向过程(重点理解)

  1.面向过程: 一切以事物的流程为核心. 核心是"过程"二字, 过程是指解决问题的步骤.即, 先干什么, 后干什么. 基于该思想编写程序就好比在编写一套流水线,是一种机械式的编程思维.

    优点: 负责的问题流程化, 编写相对简单

    缺点: 可扩展性差

  2.面向对象: 一切以对象为中心. 

    什么是对象? 不好解释,先解释解释什么是车? 有轱辘, 有方向盘, 有发动机, 会跑的是车. 好,在解释一个,什么是人,有名字, 年龄, 爱好, 会唱歌跳舞思考的是人. 我们给这两个东西下了一个简单的定义,总结: 具有相同属性和动作的结合体叫对象. 面向对象思维, 要自己建立对象,自己建立场景,你就是面向对象世界中的上帝,你想让车干嘛就干嘛,你想让人干嘛人就能干嘛. 

      优点: 可扩展性强

      缺点: 编程的复杂度大于面向过程

    对比:

      说, 要把大象装冰箱, 总共分几步? 三步. 第一步, 打开冰箱门, 第二步,装大象, 第三步,关冰箱门. 这是一个典型的面向过程的思维方式. 我们如果换成面向对象呢? 很简单, 想办法造一个会钻冰箱的大象就可以了. 然后命令大象进冰箱,大象就乖乖的进冰箱了. 这就是面向对象思维, 我们面向的不再是事物发展的流程, 而是操纵某一个事物的个体,具体的某一个事物.

二. 面向对象如何编写

  说了这么多, 面向对象的程序如何编写呢? 想想在我们的世界中,我们如何造一辆车?先由设计师来设计图纸, 设计师在图纸上勾勒出车应该是xx样的, 应该有什么,以及这台车的功能等等.然后交给工厂进行代工,根据设计师设计的图纸去创造车. 程序也一样, 我们需要先设计一个图纸,在图纸上把我要创建的对象进行描述,然后交给工人去创建对象.

  在这里, 我们画图纸的过程需要我们写类, 我们用类来描述一个对象,类的语法很简单.

class 类名:
    pass

  哦了, 这就创建出类了. 假设,我们创建一个车类

class Car:
    pass

  这就创建了一个类,图纸有了,怎么创建一辆车呢? 也很简单,我们把图纸交给工人帮我们创建一个车的实例,这个过程被称为实例化,实例化只需要: "类名()"就可以了

c = Car()   #创建一辆车

  车有了,我们的车至少得有个颜色, 车牌, 排量等等信息啊. 不同的车, 有不同的颜色, 车牌, 排量等.

c.color = "red"
c.pai = "京A66666"
c.pailiang = "1.6T"

print(c.color)
print(c.pai)
print(c.pailiang)

  我们使用"对象.特征"可以给对象设置属性信息.

  接下来, 再造一辆车, 并给车设置相关的属性信息

c2 = Car()
c2.color = "white"
c2.pai = "京B22222"
c2.pailiang = "2.0T"

print(c1)
print(c2)

  我们发现, 这两辆车是完全不同的两辆车,但是, 拥有相同的属性和信息,是不是有点儿冗余了? 怎么办呢? 想想. 我们把车的信息如果写在类中是不是会更好呢? 而且,我的车在创建的时候这些信息应该已经是设计好了的,不应该是后天设计的. 好了, 我们知道需求了, 在创建对象的时候能给对象设置一些初始化的属性信息. 在python中我们可以用__init__(self)函数给对象进行初始化操作,这个函数(方法)被称为构造函数(方法)

class Car:
    def __init__(self, color, pai, pailiang): # self表示当前类的对象,当前你创建的是谁,谁来访问的这个方法,那这个self就是谁.
        self.color = color
        self.pai = pai
        self.pailiang = pailiang

c1 = Car("red", "京A66666", "1.6T")

c2 = Car("white", "京B22222", "2,0T") 

print(c1.color)
print(c2.color)

  通过打印我们发现, 这两个对象依然像原来那样可以完成属性的设置

  属性设置完了,接下来,车不光有这些信息啊,车还会跑呢,跑是一个动作,所以我们要把跑写成一个函数. 但是在面向对象编程中, 我们不应该叫函数了, 改成叫方法,只不过这个方法写起来比正常的方法多一个参数self,仅此而已.

class Car:
    def __init__(self, color, pai, pailiang): # self表示当前类的对象, 当前你创建的是谁,谁来访问的这个用法,那这个self就是谁.
        self.color = color
        self.pai = pai
        self.pailiang = pailiang
    def run(self, speed):
        print("车可以跑%s迈" % speed)

c = Car("red", "京A66666", "2.0T")
c.run(100) # 这时,python会自动把对象c传递给run方法的第一个参数位置.

  总结: 类与对象的关系: 类是对事物的总结,抽象的概念,类用来描述对象,对象是类的实例化的结果,对象能执行哪些方法,都由类来决定. 类中定义了什么,对象就拥有什么

三. 面向对象和面向过程大PK

  那么面向对象和面向过程到底哪个好? 具体问题,具体分析. 没有绝对的好和不好, 这一点要格外注意.

  来,我们来完成之前的装大象的程序:

    1.面向过程

非函数版:
    print("开冰箱门")
    print("装大象")
    print("关冰箱门")

函数版:
def open_door():
    print("开冰箱门")
def zhuang():
    print("装大象")
def close_door():
    print("关冰箱门")

open_door()
zhuang()
close_door()

    2.面向对象

class Elephant:
    def open(self):
        print("打开冰箱门")
    def close(self):
        print("关冰箱门")
    def zhuang(self):
        print("把自己装进去")

dx = Elephant()
dx.open()
dx.close()
dx.zhuang()

  发现了吧, 面向对象简直嘛烦到爆. 别着急, 接着看下一个案例.

  小猪佩奇大战奥特曼,说,有一个小猪, 名叫佩奇, 今年40岁了,会使用嘴巴嘟嘟必杀技. 他不光大战奥特曼, 还会大战蝙蝠侠, 蜘蛛侠

    1.面向过程

def da_ao_te_man(name, age, jn):
    print("%s, 今年%s岁了, 使用%s技能疯狂输出奥特曼" % (name, age, jn))

def da_bian_fu_xia(name, age, jn):
    print("%s, 今年%s岁了, 使用%s技能疯狂输出蝙蝠侠" % (name, age, jn))

def da_zhi_zhu_xia(name, age, jn):
    print("%s, 今年%s岁了, 使用%s技能疯狂输出蜘蛛侠" % (name, age, jn))

da_ao_te_man("小猪佩奇", 39, "嘴巴嘟嘟")
da_bian_fu_xia("小猪佩奇", 39, "嘴巴嘟嘟")
da_zhi_zhu_xia("小猪佩奇", 39, "嘴巴嘟嘟")

    2.面向对象

class Pig:
    def __init__(self, name, age, jn):
        self.name = name
        self.age = age
        self.jn = jn
    def da_ao_te_man(self):
        print("%s, 今年%s岁了, 使用%s技能疯狂输出奥特曼" % (self.name, self.age,
self.jn))
    def da_bian_fu_xia(self):
        print("%s, 今年%s岁了, 使用%s技能疯狂输出蝙蝠侠" % (self.name, self.age,
self.jn))
    def da_zhi_zhu_xia(self):
        print("%s, 今年%s岁了, 使用%s技能疯狂输出蜘蛛侠" % (self.name, self.age,
self.jn))

peiqi = Pig("小猪佩奇", 39, "嘴巴嘟嘟")
peiqi.da_ao_te_man()
peiqi.da_bian_fu_xia()
peiqi.da_zhi_zhu_xia()

  感觉到一点儿眉目了吧,在这个案例中, 明显面向对象的思想更加清晰一些,代码也更容易编写一些. 所以,用哪种编程思想不是绝对的, 得根据需求和需要来完成.

四.面向对象的三大特征

  面向对象三大特征: 封装, 继承, 多态. 只要是面向对象编程语言, 都有这三个特征. 

    1.封装: 把很多数据封装到一个对象中,把固定功能的代码封装到一个代码块, 函数, 对象, 打包成模块, 这都属于封装的思想,具体的情况具体分析. 比如,你写了一个很牛B的函,那这个也可以被称为封装,在面向对象思想中, 是把一些看似无关紧要的内容组合到一起统一进行存储和使用,这就是封装.

    2. 继承: 子类可以自动拥有父类中除了私有属性外的其他所有内容. 说白了, 儿子可以随便用爹的东西,但是朋友们, 一定要认清楚一个事情,必须先有爹, 后儿子, 顺序不能乱, 在python中实现继承非常简单,在声明类的时候, 在类名后面添加一个小括号就可以完成继承关系, 那么什么情况可以使用继承呢? 单纯的从代码层面上来看, 两个类具有相同的功能或者特征的时候, 可以采用继承的形式,提取一个父类, 这个父类中编写着两个类相同的部分,然后两个类分别去继承这个类就可以了,这样写的好处是我们可以避免写很多重复的功能和代码. 如果从语义中去分析的话, 会简单很多. 如果语境中出现了x是一种y, 这时 y是一种泛化的概念,x比y更加具体, 那这时x就是y的子类. 比如, 猫是一种动物, 猫继承动物, 动物能动, 猫也能动, 这时猫在创建的时候就有了动物的"动"这个属性. 再比如,白骨精是一个妖怪. 妖怪天生就有一个比较不好的功能叫"吃人", 白骨精一出生就知道如何"吃人",此时白骨精继承妖精. 话不多说上代码

class Yao:
    def chi(self):
        print("我是妖怪, 我天生就会吃人")
class BaiGuJing(Yao): # 白骨精继承妖怪
    pass

bgj = BaiGuJing()
bgj.chi() # 我是妖怪, 我天生就会吃人# 虽然白骨精类中没有编写chi,但是他爹有啊,直接拿来用

  在python中, 一个类可以同时继承多个父类, 说白了, 现在一个儿子可能会有多个爹,既然是有这么多个爹, 总得有远有近. 比如. 有一个这样的牛B的人物, 叫锅不美,就有很多个爹嘛

class QinDie:
    def chi(self):
        print("亲爹给你好吃的")
    def play(self):
        print("亲爹会陪你玩")

class GanDie:
    def qian(self):
        print("干爹给钱啊")
    def play(self):
        print("干爹会陪你玩")

class GuNiang(QinDie, GanDie):
    pass

bumei = GuNiang()
bumei.chi() # 亲爹
bumei.qian() # 亲爹没有, 找干爹
bumei.play() # 亲爹有了, 就不找干爹了

  具体的MRO(method resolution order)算法我们到后面会具体进行分析和讲解.

    3. 多态: 同一个对象, 多种形态. 这个在python中其实是很不容易说明白的, 因为我们一直在用,只是没有具体的说,比如. 我们创建一个变量a = 10 , 我们知道此时a是整类型, 但是我们可以通过程序让a = "alex", 这时, a又变成了字符串类型, 这是我们都知道的, 但是, 我要告诉你的是, 这个就是多态性, 同一个变量a可以是多种形态,可能这样的程序和说法你还get不到具体什么是多态,接下来我们来看一个程序,北京动物园饲养员alex一天的工作,从早上开始喂养猪, 中午喂哈士奇, 晚上还得喂阿拉斯加

  来我们用代码来实现:

class Animal:
    def chi(self):
        print("动物就知道吃")

class Pig(Animal):
    def chi(self):
        print("猪在吃")

class Haski(Animal):
    def chi(self):
        print("哈士奇在吃")

class Alasika(Animal):
    def chi(self):
        print("阿拉斯加在吃")

class SiYangYuan:
    def yanng_animal(self, ani):
        ani.chi()

zhu = Pig()
erha = Haski()
ala = Alasika()

alex = SiYangYuan()
alex.yanng_animal(zhu)
alex.yanng_animal(erha)
alex.yanng_animal(ala)

  多态的好处: 程序具有超高的可扩展性, 面向对象思想的核心与灵魂. python自带多态.

 

原文地址:https://www.cnblogs.com/pythoncainiao/p/10134730.html

时间: 2024-08-30 01:50:43

Python入门-初始面向对象的相关文章

Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)

Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 ? 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以称为基类或超类,新建的类称为派生类或子类. ? 在Python中实现继承非常简单,在声明类的时候,在类名后面添加一个小括号,就可以完成继承关系.单纯的从代码的层面上来看当两个类具有相同的功能或者特征的时候就可以使用继承.提取一个父类,这个父类中编写者两个类相同的部分,然后两个类分别去继承这个类就可以

Python基础-初始面向对象

面向对象vs面向过程 面向过程 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可. 缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身. 应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等. 面向对象 面向对象的程序设计的核心是对象(上帝式思维),要

(一)Python入门-6面向对象编程:07面向对象三大特征(封装、继承、多态)-继承

一:面向对象三大特征介绍 Python是面向对象的语言,也支持面向对象编程的三大特性:继承.封装(隐藏).多态. 封装(隐藏) 隐藏对象的属性和实现细节,只对外提供必要的方法.相当于将“细节封装起来”,只 对外暴露“相关调用方法”. 通过前面学习的“私有属性.私有方法”的方式,实现“封装”.Python 追求简洁的语法,没有严格的语法级别的“访问控制符”,更多的是依靠程序员自觉实现. 继承 继承可以让子类具有父类的特性,提高了代码的重用性. 从设计上是一种增量进化,原有父类设计不变的情况下,可以

(一)Python入门-6面向对象编程:02类的定义-类和对象的关系-构造函数-实例属性-实例方法

一:类的定义 如果把对象比作一个“饼干”,类就是制造这个饼干的“模具”. 我们通过类定义数据类型的属性(数据)和方法(行为),也就是说,“类将行为和状态打 包在一起”. 对象是类的具体实体,一般称为“类的实例”.类看做“饼干模具”,对象就是根据这个“模 具”制造出的“饼干”. 从一个类创建对象时,每个对象会共享这个类的行为(类中定义的方法),但会有自己的属 性值(不共享状态).更具体一点:“方法代码是共享的,属性数据不共享”. Python中,“一切皆对象”.类也称为“类对象”,类的实例也称为“

(一)Python入门-6面向对象编程:01面向对象和面向过程区别-对象的进化

面向对象: 面向对象(Object oriented Programming,OOP)编程的思想主要是针对大型 软件设计而来的.面向对象编程使程序的扩展性更强.可读性更好,使的编程可以像搭 积木一样简单. 面向对象编程将数据和操作数据相关的方法封装到对象中,组织代码和数据的方式 更加接近人的思维,从而大大提高了编程的效率. Python完全采用了面向对象的思想,是真正面向对象的编程语言,完全支持面向 对象的基本功能,例如:继承.多态.封装等. Python中,一切皆对象.我们在前面学习的数据类型

(一)Python入门-6面向对象编程:03类对象-类属性-类方法-静态方法

一:类对象 前面讲的类定义格式中,“class 类名:”.实际上,当解释器执行class 语句时, 就会创建一个类对象. [操作] #测试类对象的生成 class Student: pass #空语句 print(type(Student)) print(id(Student)) print(Student) s1 = Student() print(s1) Stu2 = Student s2 = Stu2() print(Stu2) print(s2) 运行结果: <class 'type'>

Python之初始面向对象(3--5)

面向过程 VS 面向对象 : 面向过程的优缺点: 优点是:极大的降低了写程序的复杂度,只需要 顺着要执行的步骤,堆叠代码即可. 缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身. 面向对象的优缺点: 优点是:解决了程序的扩展性.对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易. 缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测

Python入门之面向对象module,library,package之间区别

背景 Python中有一些基本的名词,很多人,尤其是一些初学者,可能听着就很晕. 此处,简单总结一下,module,library,package之间的大概区别. Python中的module的简介 module,中文翻译为:模块 Python中的module,说白了,就是Python文件,而python文件一般后缀为py,所以就是你的xxx.py而已. library简介 library,中文翻译为:库,也常称为:库文件 之所以此处不说是Python中的library,那是因为,本身libra

Python入门之面向对象编程(二)python类的详解

本文通过创建几个类来覆盖python中类的基础知识,主要有如下几个类 Animal :各种属性.方法以及属性的修改 Dog :将方法转化为属性并操作的方法 Cat :私人属性讲解,方法的继承与覆盖 Tiger :子类定义时调用父类方法(super的使用) Animal python中的一个类中有属性和方法,而二者都分为很多种类型,如下所示 属性分为普通属性和类属性 方法分为普通方法.类方法.静态方法. 具体定义方法和使用见下面的代码和注释,各个属性和方法的使用习惯等见最后的 print_anim