1. 面向对象和面向过程

面向对象和面向过程的理解:

  1. ⾯向过程: ⼀切以事物的流程为核⼼。 核⼼是"过程"⼆字, 过程是指解决问题的步骤,即:先⼲什么,后⼲什么。基于该思想编写程序就好比在编写⼀套流⽔线,是⼀种机械式的编程思维。

    • 优点: 负责的问题流程化, 编写相对简单
    • 缺点: 可扩展性差
  2. ⾯向对象: ⼀切以对象为中⼼.

    什么是对象?事实上,我们身边的事物都是对象,一个对象它有自己的属性,它有自己的方法;就好像什么是⼈,有名字,年龄,爱好,会唱歌跳舞思考的是⼈。我们给这它下了⼀个简单的定义,总结: 具有相同属性和动作的结合体叫对象,⾯向对象思维,要⾃⼰建立对象,⾃⼰建立场景,你是就是⾯向对象世界中的上帝。

    • 优点: 可扩展性强
    • 缺点: 编程的复杂度⾼于⾯向过程

2. 面向对象如何编写:

  • 首先,我们要创建一个类,创建类的语法很简单:
class 变量名:
...

创建一个人的类:

class Person:
def __init__(self, name): # 构造方法,在类创建时就会执行
self.name = name def speek(self): # Person类的一个方法
print(f'我是{self.name}') # 在这里可以使用self来访问类中的属性和方法 p = Person('ZZC') # 创建一个具体Person类的对象
p.speek() # 通过对象名.function()可以使用类的方法 # 结果:
# 我是ZZC

通常在编写一个类的时候,会写一个__init__方法,它会在对象被创建的时候执行,这里也可以像使用函数一样给函数传递变量(如例子中的Person('ZZC'))在实例化的时候会执行并接受这个参数。

注意:关于self:

  • 这里我们可以看到,__init__speek方法都会接收一个self的参数,但是我们在传参的时候并没有手动传参给函数,这是因为解释器会自动把self参数帮我们传递给对象的方法
  • self其实就是实例本身:那个对象调用了这个方法,那个对象就是self

3. 面向对象的三大特征

了解过面向对象编程的都知道,面向对象的三大特征:封装、继承、多态。

封装

把很多数据封装到⼀个对象中,把固定功能的代码封装到⼀个代码块,函数,对象, 打包成模块,这都属于封装的思想,具体的情况具体分析。在⾯向对象思想中,是把⼀些看似⽆关紧要的内容组合到⼀起统⼀进⾏存储和使⽤. 这就是封装.

class Person:
def __init__(self, name, age, gender): # 把属性都封装在self里面
self.name = name
self.age = age
self.gender = gender def eat(self):
print(f'{self.name}正在吃饭') obj1 = Person('孙福来', 18, '女') # 实例化一个类,得到一个对象
print(obj1.age) # 要访问类的属性都需要通过对象来访问
obj.eat() # 要执行类中的方法也要通过类来访问

继承

一个类在定义的时候可以继承自其他的类,继承的类默认拥有其父类的属性和方法。在python中实现继承非常简单. 在声明类的时候, 在类名后⾯添加⼀个⼩括号,就可以完成继承关系。

class A:
def func1(self):
print('这是fun1函数') class B(A):
pass
b = B()
b.func1() # 打印: 这是fun1函数

那么什么情况可以使⽤继承呢? 单纯的从代码层⾯上来看. 两个类具有相同的功能或者特征的时候. 可以采⽤继承的形式. 提取⼀个⽗类, 这个⽗类中编写着两个类相同的部分. 然后两个类分别取继承这个类就可以了. 这样写的好处是我们可以避免写很多重复的功能和代码.

class DBUtil:
def __init__(self, host, port, username, passwd):
self.host = host
self.port = port
self.usernam = username
self.passwd = passwd
def connetc(self):
pass
def close(self):
pass class MysqlUtil(DBUtil):
def inser(self):
pass
def delete(self):
pass
def update(self):
pass
def select(self):
pass class RedisUtil(DBUtil):
def inser(self):
pass
def delete(self):
pas
def update(self):
pass
def select(self):
pass

如上,假设我们要编写一个操作数据库的工具,那么就可以把一些公共的功能都写在父类中,对于具体的数据库操作实现都放在子类中,那样就可以避免编写多余的重复代码。

在python中还可以继承自多个类,在继承多各类时查找父类中的属性有一定的顺序,具体的顺序是基于MRO c3算法来计算的,关于这一块后面再补上。

多态

同⼀个对象,多种形态。多态在python中体现的并不是很明显,我们通过例子来看:

class Animal:
def eat(self):
print('这只动物正在吃,疯狂的吃') class Cat(Animal):
def eat(self):
print(f'猫正在吃') class Dog(Animal):
def eat(self):
print(f'狗正在吃') class Tiger(Animal):
pass class Watch:
def func(self, obj):
obj.eat() c = Cat()
d = Dog()
t = Tiger() w = Watch()
w.func(c) # 猫正在吃
w.func(d) # 狗正在吃
w.func(t) # 这只动物正在吃,疯狂的吃

在上面的例子中,我们通过Watch类创建出的对象w来执行各种动物的eat方法,这个方法要接收一个参数,即把各个动物的对象传进去,然后执行对象中的eat方法,而这个方法只要接收的对象拥有eat方法,那么就可执行这个eat方法,因此只要保证传入进来的对象中有这个方法,就能够正常运行。这就是同⼀个对象,多种形态的表现;在python中,多态是鸭子模式的一种体现。

多态的好处: 程序具有超⾼的可扩展性. ⾯向对象思想的核⼼与灵魂. python⾃带多态

python学习笔记:第15天 初识面向对象的更多相关文章

  1. Python学习笔记(15)- os\os.path 操作文件

    程序1 编写一个程序,统计当前目录下每个文件类型的文件数,程序实现如图: import os def countfile(path): dict1 = {} # 定义一个字典 all_files = ...

  2. python学习笔记-(一)初识python

    1.python的前世今生 想要充分的了解一个人,无外乎首先充分了解他的过去和现在:咱们学习语言也是一样的套路 1.1 python的历史 Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈp ...

  3. Python学习笔记(一)初识Python以及安装Python

    一.Python简介 1.Python发展史 Python 是由 Guido van Rossum 在八十年代末和九十年代初,在荷兰国家数学和计算机科学研究所设计出来的. Python 本身也是由诸多 ...

  4. Python学习日记(二十二) 初识面向对象

    引子 假设我们要开发一个关于飞机大战的游戏,那么游戏的里面就会有两个角色,分别是属于玩家操控的战机和敌方的战机,并且两个战机都有不同的技能或攻击方式,现在我们用自己目前所学的去写出下面的这些代码: d ...

  5. python学习笔记(15)--pygame的安装

    说明: 1. 现在是2017.3.9号,最新的python版本是3.6,最新的pygame是1.9.3,这两个最好都用32位的. 2. pygame1.9.3下载地址:http://www.lfd.u ...

  6. python学习笔记:第18天 面向对象04-反射

    目录 issubclass和isinstance 区分函数和方法 反射 issubclass和isinstance issubclass:可以判断一个类是否另一个类的子类. # issubclass ...

  7. python学习笔记:第17天 面向对象03 类与类之间的关系

    一.类与类之间的依赖关系 ⼤千世界, 万物之间皆有规则和规律. 我们的类和对象是对⼤千世界中的所有事物进⾏归类. 那事物之间存在着相对应的关系. 类与类之间也同样如此. 在⾯向对象的世界中. 类与类 ...

  8. python学习笔记:第16天 面向对象02--对象中的成员

    目录 ⼀.类的成员介绍: 二.类的成员-变量 三.类的成员-方法 四.类的成员-属性 五.私有属性 ⼀.类的成员介绍: ⾸先, 什么是类的成员. 很简单. 我么能在类中写什么? 写的内容就是成员. 到 ...

  9. python学习笔记(十九)面向对象编程,类

    一.面向对象编程 面向对象,是一种程序设计思想. 编程范式:编程范式就是你按照什么方式去编程,去实现一个功能.不同的编程范式本质上代表对各种类型的任务采取的不同的解决问题的思路,两种最重要的编程范式分 ...

  10. python学习笔记(15)pymysql数据库操作

    pymysql数据库操作 1.什么是PyMySQL 为了使python连接上数据库,你需要一个驱动,这个驱动是用于与数据库交互的库. PyMySQL : 这是一个使Python连接到MySQL的库,它 ...

随机推荐

  1. linux下网络编程学习——入门实例ZZ

    http://www.cppblog.com/cuijixin/archive/2008/03/14/44480.html 是不是还对用c怎么实现网络编程感到神秘莫测阿,我们这里就要撕开它神秘的面纱, ...

  2. Linq中使用Left Join 和 Right Join

    原文地址:http://www.cnblogs.com/xinjian/archive/2010/11/17/1879959.html 准备一些测试数据,如下: use Test Create tab ...

  3. win10系统 WMI Provider Host cpu 占用过高

    今天上班,发现系统有点卡,QQ总是没响应. 打开任务管理器,发现有一个程序- WMI Provider Host 占用cpu竟然高达80% 然后通过事件查看器发现是一个pid为9832的程序造成的 然 ...

  4. FQDN说明

    以下摘自百度百科: FQDN:(Fully Qualified Domain Name)完全合格域名/全称域名,是指主机名加上全路径,全路径中列出了序列中所有域成员.全域名可以从逻辑上准确地表示出主机 ...

  5. Python学习---匿名函数和闭包的学习

    1.1. 匿名函数 匿名函数的命名规则:  用lamdba 关键字标识,冒号(:)左侧表示函数接收的参数(a,b) ,冒号(:)右侧表示函数的返回值(a+b). 因为lamdba在创建时不需要命名,所 ...

  6. Spring学习总结之---装配Bean

    Spring配置的可选方案 前言:Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系,作为开发人员,你需要告诉Spring容器要创建那些Bean,以哪种方式创建,并且如何将 ...

  7. Latex 参考文献引用

    转:http://blog.sina.com.cn/s/blog_4b164557010143tl.html 导入 \usepackage[option]{natbib} 具体的 option 有 r ...

  8. PhoneGap实现重力感应

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. Impala 加载Hive的UDF

    Impala的UDF有两种: Native Imapal UDF:使用C++开发的,性能极高,官方性能测试比第二种高出将近10倍 Hive的UDF:是Hive中的UDF,直接加载到Impala中,优点 ...

  10. [原创] 腾讯RTX二次开发相关的一些注意事项

    在企业即时通信方面,腾讯的RTX在国内的占有率应该是很高的 所以,就避免不了要与其他系统进行消息集成 腾讯为此提供了二次开发的工具包,支持JAVA.C#.VB等多种开发语言 但是,目前为止,腾讯官方提 ...