本文,我们先说封装,封装就是根据职责将属性和方法封装到一个抽象的类中;

一.面向对象基本概念

我们之前学习的编程方式就是面向过程的

面向过程和面向对象,是两种不同的编程方式

对比 面向过程 的特点,可以更好地了解什么是 面向对象

1.1 过程和函数(基础铺垫)

过程是早期的一个编程概念

过程类似于函数,只能执行,但是没有返回值

函数不仅能执行,还可以返回结果(return)

1.2 面向过程 和 面向对象 基本概念

1)面向过程——怎么做?

把完成某一个需求的所有步骤从头到尾逐步实现

根据开发需求,将某些功能独立的代码封装成一个又一个函数

最后完成的代码,就是顺序地调用不同的函数

面向过程编程的特点:

注重 步骤与过程,不注重职责分工

如果需求复杂,代码会变得很复杂

开发复杂项目,没有固定的套路,开发难度很大!

2)面向对象——谁来做?

相比较函数,面向对象是更大的封装,根据职责在一个对象中封装多个方法

在完成某一个需求前,首先确定职责——要做的事情(方法)

根据职责确定不同的对象,在对象内部封装不同的方法(多个)

最后完成的代码,就是顺序地让 不同的对象 调用 不同的方法

特点:

注重 对象和职责,不同的对象承担不同的责任

更加适合应对复杂的需求变化,是专门应对复杂项目开发,提供的固定套路

需要在面向过程基础上,再学习一些面向对象的语法

二. 类和对象

2.1 类和对象的概念

类 和 对象 是面向 对象编程 的两个核心概念

1)类

类 是对一群具有 相同特征 或者 行为 的事物的一个统称,是抽象的,不能直接使用

特征 被称为 属性

行为 被称为 方法

类 就相当于制造游轮时的图纸,是一个 模板,是 负责创建对象的

那这张图纸能在大海上航行吗 ? 所以,在面向对象开发中,类j是抽象的,不能直接使用,类的职责很单一,就是负责创建对象的;

2)对象

对象 是 由类创建出来的一个具体存在,可以直接使用

由 哪一个类 创建出来的 对象,就拥有在 哪一个类 中定义的:

属性

方法

对象 就相当于用 图纸 制造 的游轮

在程序开发中,应该 先有类,再有对象

2.2 类和对象的关系

类是模板,对象是根据类这个模板创建出来的,应该先有类,再有对象

类只有一个,而对象可以有很多个(有了一张图纸,就会有很多很多的邮轮)

不同的对象之间属性可能会各有不相同(我们看上面的两张图,虽然都是能在海里航行的邮轮,但是邮轮的颜色可以各不相同)

类中定义了什么属性和方法,对象中就有什么属性和方法,不可能多,也不可能少

三.类的设计

在使用面向对象开发前,应该首先分析需求,确定一下,程序中需要包含哪些类

在程序开发中,要设计一个类,通常需要满足一下三个要素:

类名 这类事物的名字,满足大驼峰命名法

属性 这类事物具有什么样的特征

方法 这类事物具有什么样的行为

大驼峰命名法

CapsWords

每一个单词的首字母大写

单词与单词之间没有下划线

3.1 类名的确定

名词提炼法 分析 整个业务流程,出现的名词,通常就是找到的类

3.2 属性和方法的确定

对 对象的特征描述,通常可以定义成属性

对象具有的行为(动词),通常可以定义成方法

例如:

需求

小张今年25岁,身高1.76,每天早上跑完步,会去吃东西

小李今年30岁,身高1.72,不跑步,喜欢吃东西

Person

name age height

run() eat()

四.定义简单的类(只包含方法)

面向对象是更大的封装,在一个类中封装多个方法,这样通过这个类创建处理的对象,就可以直接调用这些方法了!

4.1 定义只包含方法的类

在Python中要定义一个只包含方法的类,语法格式如下:

class 类名:

def 方法1(self,参数列表):

pass

def 方法2(self,参数列表):

pass

方法的定义格式和之前学习过的函数几乎一样

区别在于第一参数必须是self,大家暂时先记住,稍后介绍self

注意:类名的命名规则要符合大驼峰命名法

4.2 创建对象

当一个类定义完成之后,要使用这个类来创建对象,语法格式如下:

对象变量 = 类名()

五.初始:第一面向对象程序

需求

小猫 爱 吃 鱼,小猫 要 喝 水

分析

定义一个猫类 Cat

定义两个方法 eat 和 drink

按照需求-- 不需要定义属性

Cat

eat(self) drink(self)

class Cat:

def eat(self):

print("小猫爱吃鱼")

def drink(self):

print("小猫要喝水")

# 创建猫对象

tom = Cat()

tom.eat()

tom.drink()

>>>

六. 在类的外部给对象增加属性

在 Python 中,要给对象设置属性非常容易,但是不推荐使用。

因为:对象属性的封装应该封装在类的内部

只需在类的外部的代码中直接通过,设置一个属性即可

class Cat:

def eat(self):

print("小猫爱吃鱼")

def drink(self):

print("小猫要喝水")

# 创建猫对象

tom = Cat()

# 使用 .属性名

tom.name = "Tom"

name 明明在 Cat 类中并没有该属性,但是为什么可以给name赋值呢?可以把该对象看成是json串,由于Python是解释型语言,所以并不会在内存中创建该对象,只是以字符串形式来保存该对象,所以属性可以随时删减也就不奇怪了!

七. 使用 self 在方法内部输出每一只猫的名字

由 哪一个对象 调用的方法,方法内的 self 就是哪一个对象的引用

在类封装的方法内部,self 就表示 当前调用方法的对象自己

调用方法时,程序员不需要传递 self 参数

在方法内部

可以通过 self ,访问对象的属性

也可以通过 self ,调用其他的对象方法

class Cat:

def eat(self):

print("%s 爱吃鱼" % self.name)

def drink(self):

print("小猫要喝水")

# 创建猫对象

tom = Cat()

tom.name = "Tom"

tom.eat()

tom.drink()

>>> Tom 爱吃鱼

>>> 小猫要喝水

八. 之前代码存在的问题 —— 在类的外部给对象增加属性

class Cat:

def eat(self):

print("%s 爱吃鱼" % self.name)

def drink(self):

print("小猫要喝水")

# 创建猫对象

tom = Cat()

tom.eat()

tom.drink()

# 如果把 .name 放在后面

tom.name = "Tom"

>>> AttributeError:'Cat' object has no attribute 'name

在日常开发中, 不推荐在类的外部给对象增加属性

如果在运行时,没有找到属性,程序会报错

对象应该包含哪些属性,应该封装在类的内部

九. Python 对象的初始化方法

当使用 类名() 创建对象时,Python解释器会自动执行以下操作:

为对象在内存中 分配空间 – 创建对象

为对象的属性 设置初始值 – 初始化方法(init)

这个 初始化方法 就是 __ init__ , __ init__ 是对象的内置方法

__ init__ 方法是专门用来定义一个类具有哪些属性的方法!

class Cat:

def __init__(self):

print("这是一个初始化方法")

# 使用 类名() 创建对象的时候,会自动调用初始化方法 __init__

tom = Cat()

>>> 这是一个初始化方法

十. 在初始化方法内部定义属性

在 __ init__ 方法内部使用 self.属性名 = 属性的初始值 就可以定义属性

定义属性之后,在使用 Cat 类创建对象,都会拥有该属性

class Cat:

def __init__(self):

print("这是一个初始化方法")

# 定义用 Cat 类创建的猫对象有一个 name 的属性

self.name = "Tom"

def eat(self):

print("%s 爱吃鱼" % self.name)

# 使用 类名() 创建对象的时候,会自动调用初始化方法 __init__

tom = Cat()

tom.eat()

>>> Tom 爱吃鱼

十一.改造初始化方法 —— 初始化的同时设置初始值

在开发中,如果希望在创建对象的同时,就设置对象的属性,可以对 __ init__ 方法进行改造

把希望设置的属性值,定义成 __ init__ 方法的参数

在方法内部使用 self.属性 = 形参 接收外部传递的参数

在创建对象时,使用 类名(属性1,属性2… …) 调用

class Cat:

def __init__(self, new_name):

print("这是一个初始化方法")

self.name = new_name

def eat(self):

print("%s 爱吃鱼" % self.name)

# 使用 类名() 创建对象的时候,会自动调用初始化方法 __init__

tom = Cat("Tom")

print(tom.name)

lazy_cat = Cat("大懒猫")

lazy_cat.eat()

>>> Tom

>>> 大懒猫爱吃鱼

End.

作者:朱元禄(Jacky)

来源:微博

python函数的四个特点_Python面向对象三大特征之封相关推荐

  1. python对象三个特性_Python面向对象三大特征之多

    一.什么是多态: 多态可以增加代码的灵活度 以 继承 和 重写父类方法为前提 是调用方法的技巧,不会影响到类的内部设计 不同的子类对象调用相同的父类方法,产生不同的执行结果 class Dog(obj ...

  2. python函数支持哪些参数类型_Python函数的几种参数类型

    以下代码均以Python3为基础理解. 初识Python函数 大部分常见的语言如C.Java.PHP.C#.JavaScript等属于C系语言,Python不属于他们中的一员(ruby亦然).在这些语 ...

  3. python函数定义的语法形式_Python 函数(一) 基本语法

    ​Python 函数 python中可以将某些具备一定功能的代码写成一个函数,函数可以在一定程度上减少代码的冗余,节约书写代码的时间. Python中定义好的函数是可以通过函数名称调取并重复使用的模块 ...

  4. python函数的作用是什么_Python函数

    python函数讲解 函数三问: 什么是函数? 函数就是可以完成特定功能的代码块,函数就是存放代码的容器可以理解为一个装有一些工具的箱子 为什么有函数? 1.减少了代码的冗余 2.让程序增加了可扩展性 ...

  5. python函数参数类型及顺序_python函数参数类型及其顺序

    根据inspect模块官文文档中关于函数参数类型的相关说明,python函数参数共有五种类型,按顺序分别为:POSITIONAL_ONLY.POSITIONAL_OR_KEYWORD.VAR_POSI ...

  6. python函数对变量的作用_python函数对变量的作用及遵循的原则

    1.全局变量和局部变量 全局变量:指在函数之外定义的变量,一般没有缩进,在程序执行的全过程有效 局部变量:指在函数内部使用的变量,仅在函数内部有效,当函数退出时变量将不存在 例如: 1 n=1 #n是 ...

  7. python函数返回多个值_python函数返回多个值的示例方法

    python可以返回多个值,确实挺方便 函数里的return只能返回一个值,但是返回类型是没是限制的 因此,我们可以"返回一个 tuple类型,来间接达到返回多个值". 例子是我在 ...

  8. python函数求n年后本息_Python自定义函数计算给定日期是该年第几天的方法示例...

    本文实例讲述了Python自定义函数计算给定日期是该年第几天的方法.分享给大家供大家参考,具体如下: 写一个函数,计算给定日期是该年的第几天. 满足闰年的条件: 闰年是公历中的名词,能被4整除但不能被 ...

  9. python函数装饰器详解_Python语言函数装饰器用法实例详解

    这篇文章主要介绍了Python语言函数装饰器用法,以实例形式较为详细的分析了Python函数装饰器的常见使用技巧,需要的朋友可以参考下,希望对大家学习Python语言有所帮助. 本文实例讲述了pyth ...

最新文章

  1. 数据库期末复习重点,临时抱佛脚高分通过考试
  2. 15个应该掌握的jupyter notebook技巧
  3. 软件研发之道——有关软件的思考
  4. 根据网络状态获取Ip地址
  5. Pots POJ - 3414(bfs)
  6. jquery中获取下拉框的文本值
  7. android关机背景,鍵盤消失后的Android白色背景
  8. 零基础也能看懂!数据仓库与数据库的这几个问题,你能回答出来吗
  9. php 中文截断,PHP中实现中文字串截取无乱码的解决方法
  10. Python工程师必看的面试问题与解答(中)
  11. mysql读写分离-借助中间键mycat
  12. bzoj 1217 [HNOI2003]消防局的设立 贪心
  13. 荒唐可笑的文言文编程语言
  14. 3.cesium雨、雪、雾天气场景效果
  15. 我在雷军2021年度演讲上,依稀仿佛看到了老罗的影子
  16. 用python制作贺卡怎么显示人名_制作python程序来处理卡片的麻烦.
  17. XPO 的三篇介绍文章。
  18. 阿里云oss图片的常用处理方法小结
  19. qtcreator-ros环境构建及编译ros工程
  20. spring4+hibernate4+springmvc+nginx+redis实现session共享

热门文章

  1. HTML5锚点请用id代替name
  2. Oracle Statspack分析报告详解(一)
  3. 【Arduino】开发入门【八】舵机操作+源代码
  4. SharePoint 2010 整合Sil“.NET研究”verlight 4应用 - 任务管理
  5. 20.案例实战:为@Async实现一个自定义线程池
  6. 17.如何正确使用TCP
  7. 【论文写作】体育城场地预约系统的数据表如何设计
  8. 基于asp.net sql社区物业管理系统毕业设计网站
  9. python 分布式锁_Python分布式锁 Sherlock
  10. 可用来编写html的文件,Web前端