Python面向对象原理与基础语法详解


Posted in Python onJanuary 02, 2020

本文实例讲述了Python面向对象原理与基础语法。分享给大家供大家参考,具体如下:

目标

dir 内置函数
定义简单的类(只包含方法)
方法中的 self 参数
初始化方法
内置方法和属性

01. dir 内置函数(知道)

在 Python 中 对象几乎是无所不在的,我们之前学习的 变量、数据、函数 都是对象
在 Python 中可以使用以下两个方法验证:

在 标识符 / 数据 后输入一个 .,然后按下 TAB 键,iPython 会提示该对象能够调用的 方法列表
使用内置函数 dir 传入 标识符 / 数据,可以查看对象内的 所有属性及方法
提示 方法名 格式的方法是 Python 提供的 内置方法 / 属性,稍后会给大家介绍一些常用的 内置方法 / 属性
Python面向对象原理与基础语法详解
提示 利用好 dir() 函数,在学习时很多内容就不需要死记硬背了

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

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

2.1 定义只包含方法的类

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

class 类名:

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

方法 的定义格式和之前学习过的函数 几乎一样
区别在于第一个参数必须是 self,大家暂时先记住,稍后介绍 self
注意:类名 的 命名规则 要符合 大驼峰命名法

2.2 创建对象

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

对象变量 = 类名()

2.3 第一个面向对象程序

需求

小猫 爱 吃 鱼,小猫 要 喝 水
分析

定义一个猫类 Cat
定义两个方法 eat 和 drink
按照需求 —— 不需要定义属性
Python面向对象原理与基础语法详解

class Cat:
  """这是一个猫类"""

  def eat(self):
    print("小猫爱吃鱼")

  def drink(self):
    print("小猫在喝水")

tom = Cat()
tom.drink()
tom.eat()

引用概念的强调
在面向对象开发中,引用的概念是同样适用的!

在 Python 中使用类 创建对象之后,tom 变量中 仍然记录的是 对象在内存中的地址
也就是 tom 变量 引用 了 新建的猫对象
使用 print 输出 对象变量,默认情况下,是能够输出这个变量 引用的对象 是 由哪一个类创建的对象,以及 在内存中的地址(十六进制表示)
提示:在计算机中,通常使用 十六进制 表示 内存地址

十进制 和 十六进制 都是用来表达数字的,只是表示的方式不一样
十进制 和 十六进制 的数字之间可以来回转换
%d 可以以 10 进制 输出数字
%x 可以以 16 进制 输出数字
案例进阶 —— 使用 Cat 类再创建一个对象

lazy_cat = Cat()
lazy_cat.eat()
lazy_cat.drink()

03. 方法中的 self 参数

3.1 案例改造 —— 给对象增加属性

在 Python 中,要 给对象设置属性,非常的容易,但是不推荐使用
因为:对象属性的封装应该封装在类的内部
只需要在 类的外部的代码 中直接通过 . 设置一个属性即可
注意:这种方式虽然简单,但是不推荐使用!

tom.name = "Tom"
...

lazy_cat.name = "大懒猫"

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

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

在类封装的方法内部,self 就表示 当前调用方法的对象自己
调用方法时,程序员不需要传递 self 参数
在方法内部
可以通过 self. 访问对象的属性
也可以通过 self. 调用其他的对象方法
改造代码如下:

class Cat:

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

tom = Cat()
tom.name = "Tom"
tom.eat()

lazy_cat = Cat()
lazy_cat.name = "大懒猫"
lazy_cat.eat()

Python面向对象原理与基础语法详解
在 类的外部,通过 变量名. 访问对象的 属性和方法
在 类封装的方法中,通过 self. 访问对象的 属性和方法

04. 初始化方法

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

将案例代码进行调整,先调用方法 再设置属性,观察一下执行效果

tom = Cat()
tom.drink()
tom.eat()
tom.name = "Tom"
print(tom)

程序执行报错如下:

AttributeError: 'Cat' object has no attribute 'name'
属性错误:'Cat' 对象没有 'name' 属性

提示

在日常开发中,不推荐在 类的外部 给对象增加属性
如果在运行时,没有找到属性,程序会报错
对象应该包含有哪些属性,应该 封装在类的内部

4.2 初始化方法

当使用 类名() 创建对象时,会 自动 执行以下操作:
为对象在内存中 分配空间 —— 创建对象
为对象的属性 设置初始值 —— 初始化方法(init)
这个 初始化方法 就是 init 方法,init 是对象的内置方法
init 方法是 专门 用来定义一个类 具有哪些属性的方法!

在 Cat 中增加 init 方法,验证该方法在创建对象时会被自动调用

class Cat:
  """这是一个猫类"""

  def __init__(self):
    print("初始化方法")

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

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()

4.4 改造初始化方法 —— 初始化的同时设置初始值

在开发中,如果希望在 创建对象的同时,就设置对象的属性,可以对 init 方法进行 改造
把希望设置的属性值,定义成 init 方法的参数
在方法内部使用 self.属性 = 形参 接收外部传递的参数
在创建对象时,使用 类名(属性1, 属性2…) 调用

class Cat:

  def __init__(self, name):
    print("初始化方法 %s" % name)
    self.name = name
  ...
  
tom = Cat("Tom")
...

lazy_cat = Cat("大懒猫")
...

05. 内置方法和属性

Python面向对象原理与基础语法详解

5.1 del 方法(知道)

在 Python 中

当使用 类名() 创建对象时,为对象 分配完空间后,自动 调用 init 方法
当一个 对象被从内存中销毁 前,会 自动 调用 del 方法
应用场景

init 改造初始化方法,可以让创建对象更加灵活
del 如果希望在对象被销毁前,再做一些事情,可以考虑一下 del 方法
生命周期

一个对象从调用 类名() 创建,生命周期开始
一个对象的 del 方法一旦被调用,生命周期结束
在对象的生命周期内,可以访问对象属性,或者让对象调用方法
class Cat:

class Cat:

  def __init__(self, new_name):

    self.name = new_name

    print("%s 来了" % self.name)

  def __del__(self):

    print("%s 去了" % self.name)

# tom 是一个全局变量
tom = Cat("Tom")
print(tom.name)

# del 关键字可以删除一个对象
del tom

print("-" * 50)

5.2 str 方法

在 Python 中,使用 print 输出 对象变量,默认情况下,会输出这个变量 引用的对象 是 由哪一个类创建的对象,以及 在内存中的地址(十六进制表示)
如果在开发中,希望使用 print 输出 对象变量 时,能够打印 自定义的内容,就可以利用 str 这个内置方法了
注意:str 方法必须返回一个字符串

class Cat:

  def __init__(self, new_name):

    self.name = new_name

    print("%s 来了" % self.name)

  def __del__(self):

    print("%s 去了" % self.name)

  def __str__(self):
    return "我是小猫:%s" % self.name

tom = Cat("Tom")
print(tom)

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python类型强制转换long to int的代码
Feb 10 Python
Python高级应用实例对比:高效计算大文件中的最长行的长度
Jun 08 Python
Python内置函数OCT详解
Nov 09 Python
Python探索之爬取电商售卖信息代码示例
Oct 27 Python
小白如何入门Python? 制作一个网站为例
Mar 06 Python
Python爬虫获取图片并下载保存至本地的实例
Jun 01 Python
pycharm中成功运行图片的配置教程
Oct 28 Python
Pytorch 搭建分类回归神经网络并用GPU进行加速的例子
Jan 09 Python
Python 3.9的到来到底是意味着什么
Oct 14 Python
pycharm配置QtDesigner的超详细方法
Jan 25 Python
python中random模块详解
Mar 01 Python
Selenium浏览器自动化如何上传文件
Apr 06 Python
Pytorch 的损失函数Loss function使用详解
Jan 02 #Python
Python面向对象封装操作案例详解 II
Jan 02 #Python
Python实现搜索算法的实例代码
Jan 02 #Python
python 实现从高分辨图像上抠取图像块
Jan 02 #Python
python base64库给用户名或密码加密的流程
Jan 02 #Python
python文件处理fileinput使用方法详解
Jan 02 #Python
linux 下python多线程递归复制文件夹及文件夹中的文件
Jan 02 #Python
You might like
php smarty函数扩展
2010/03/15 PHP
Sorting Array Values in PHP(数组排序)
2011/09/15 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
2015/08/18 PHP
php7性能提升的原因详解
2019/10/13 PHP
PHP变量的作用范围实例讲解
2020/12/22 PHP
制作特殊字的脚本
2006/06/26 Javascript
不间断滚动JS打包类,基本可以实现所有的滚动效果,太强了
2007/12/08 Javascript
关于JavaScript的一些看法
2009/05/27 Javascript
js 操作select相关方法函数
2009/12/06 Javascript
jQuery EasyUI API 中文文档 - ComboGrid 组合表格
2011/10/13 Javascript
JavaScript中把数字转换为字符串的程序代码
2013/06/19 Javascript
使用indexOf等在JavaScript的数组中进行元素查找和替换
2013/09/18 Javascript
Jquery插件分享之气泡形提示控件grumble.js
2014/05/20 Javascript
escape编码与unescape解码汉字出现乱码的解决方法
2014/07/02 Javascript
jQuery中parents()方法用法实例
2015/01/07 Javascript
jQuery实现Tab菜单滚动切换的方法
2015/09/21 Javascript
JS将滑动门改为选项卡(需鼠标点击)的实现方法
2015/09/27 Javascript
vue2.0实现分页组件的实例代码
2017/06/22 Javascript
python实现定制交互式命令行的方法
2014/07/03 Python
在服务器端实现无间断部署Python应用的教程
2015/04/16 Python
Python同时向控制台和文件输出日志logging的方法
2015/05/26 Python
使用Python搭建虚拟环境的配置方法
2018/02/28 Python
使用Python正则表达式操作文本数据的方法
2019/05/14 Python
python twilio模块实现发送手机短信功能
2019/08/02 Python
canvas像素画板的实现代码
2018/11/21 HTML / CSS
html5 svg 中元素点击事件添加方法
2013/01/16 HTML / CSS
详解HTML5 data-* 自定义属性
2018/01/24 HTML / CSS
飞利浦美国官网:Philips美国
2020/02/28 全球购物
俄罗斯鲜花递送:AMF
2020/04/24 全球购物
用C#语言写出在本地创建一个UDP接收端口的具体过程
2016/02/22 面试题
《金钱的魔力》教学反思
2014/02/24 职场文书
事业单位竞聘上岗实施方案
2014/03/28 职场文书
青年志愿者活动感想
2015/08/07 职场文书
小学四年级班主任工作经验交流材料
2015/11/02 职场文书
全网非常详细的pytest配置文件
2022/07/15 Python
Win11 Beta 预览版 22621.575 和 22622.575更新补丁KB5016694发布(附更新内容大全)
2022/08/14 数码科技