简述 Python 的类和对象


Posted in Python onAugust 21, 2020

系列最后一篇来说说Python中的类与对象,Python这门语言是无处不对象,如果你曾浅要了解过Python,你应该听过Python是一种面向对象编程的语言,所以你经常可能会看到面向“对象”编程这类段子,而面向对象编程的语言都会有三大特征:封装、继承、多态。

我们平时接触到的很多函数、方法的操作都具有这些性质,我们只是会用,但还没有去深入了解它的本质,下面就介绍一下关于类和对象的相关知识。

封装

封装这个概念应该并不陌生,比如我们把一些数据封装成一个列表,这就属于数据封装,我们也可以将一些代码语句封装成一个函数方便调用,这就是代码的封装,我们也可以将数据和代码封装在一起。用术语表示的话,就是可以将属性和方法进行封装,从而得到对象。

首先我们可以定义一个类,这个类中有属性和方法,但有的伙伴会比较好奇,属性和方法不是会封装成对象嘛,为什么又变成类了?举个例子,类就好比是一个毛坯房,而对象是在毛坯房的基础上改造成的精装房。

class XiaoMing:
  #属性
  height = 180
  weight = 65
  sex = '男'
  #方法
  def run(self):
    print('小明在跑步')
  def sleep(self):
    print('小明在睡觉')

在类定义完成时就创建了一个类对象,它是对类定义创建的命名空间进行了一个包装。类对象支持两种操作:属性引用和实例化。

属性引用的语法就是一般的标准语法:obj.name。比如XiaoMing.height和XiaoMing.run就是属性引用,前者会返回一条数据,而后者会返回一个方法对象。

In[1]:print(XiaoMing.height)
Out[1]:180

In[2]:print(XiaoMing.run)
Out[2]:<function XiaoMing.run at 0x0000021C6239D0D0>

这里也支持对类属性进行赋值操作,比如为类中的weight属性赋予一个新值。

In[3]:print(XiaoMing.weight)
Out[3]:65

In[4]:XiaoMing.weight = 100
In[5]:print(XiaoMing.weight)
Out[5]:100

而类的实例化可以将类对象看作成一个无参函数的赋值给一个局部变量,如下:

In[6]:ming = XiaoMing()

ming就是由类对象实例化后创建的一个实例对象,通过实例对象也可以调用类中的属性和方法。

In[7]:ming.run()
Out[7]:小明在跑步

In[8]:print(xiaoming.height)
Out[8]:180
#通过向类对象调用方法返回的方法对象中传入实例对象也可以达到同样效果
In[11]:XiaoMing.run(ming)
Out[11]:小明在跑步

魔法方法__init__

类在实例化过程中并不都是像上面例子一样简单的,一般类都会倾向将实例对象创建为有初始状态的,所以在类中可能会定义一个__init__的魔法方法,这个方法就可以帮助接收、传入参数。

而一个类如果定义了__init__方法,那么在类对象实例化的过程中就会自动为新创建的实例化对象调用__init__方法,请看下面这个例子。

class Coordinates:
  def __init__(self,x,y):
    self.x = x
    self.y = y
  def print_coor(self):
    print('当前坐标为(%s,%s)'%(self.x,self.y))

可以看到在__init__()中传入了参数x和y,然后在print_coor中需要接收参数x和y,接下来通过实例化这个类对象,验证一下参数是否能通过__init__()传递到类的实例化操作中。

In[9]:coor = Coordinates(5,3)
In[10]:coor.print_coor()

Out[10]:当前坐标为(5,3)

继承

所谓继承就是一个新类在另一个类的基础上构建而成,这个新类被称作子类或者派生类,而另一个类被称作父类、基类或者超类,而子类会继承父类中已有的一些属性和方法。

class Mylist(list):
  pass
list_ = Mylist()
list_.append(1)
print(list_)
''' [1] '''

比如上面这个例子,我并没有将list_定义成一个列表,但它却能调用append方法。原因是类Mylist继承于list这个基类,而list_又是Mylist的一个实例化对象,所以list_也会拥有父类list拥有的方法。

当然可以通过自定义类的形式实现两个类之间的继承关系,我们定义Parent和Child两个类,Child中没有任何属性和方法,只是继承于父类Parent。

class Parent:
  def par(self):
    print('父类方法')
class Child(Parent):
  pass
child = Child()
child.par()
'''
父类方法
'''

覆盖

当子类中定义了与父类中同名的方法或者属性,则会自动覆盖父类对应的方法或属性,还是用上面这个例子实现一下,方便理解。

class Parent:
  def par(self):
    print('父类方法')
class Child(Parent):
  def par(self):
    print('子类方法')
child = Child()
child.par()
'''
子类方法
'''

可以看到子类Child中多了一个和父类Parent同名的方法,再实例化子类并调用这个方法时,最后调用的是子类中的方法。
Python中继承也允许多重继承,也就是说一个子类可以继承多个父类中的属性和方法,但是这类操作会导致代码混乱,所以大多数情况下不推荐使用,这里就不过多介绍了。

多态

多态比较简单,比如定义两个类,这两个类没有任何关系,只是两个类中有同名的方法,而当两个类的实例对象分别调用这个方法时,不同类的实例对象调用的方法也是不同的。

class XiaoMing:
  def introduce(self):
    print("我是小明")
class XiaoHong:
  def introduce(self):
    print("我是小红")

上面这两个类中都有introduce方法,我们可以实例化一下两个类,利用实例对象调用这个方法实现一下多态。

In[12]:ming = XiaoMing()
In[13]:hong = XiaoHong()

In[14]:ming.introduce()
Out[14]:我是小明

In[15]:hong.introduce()
Out[15]:我是小红

常用BIF

1、issubclass(class,classinfo)

判断一个类是否是另一个类的子类,如果是则返回True,反之则返回False。

class Parent:
  pass
class Child(Parent):
  pass
print(issubclass(Child,Parent))
'''
True
'''

需要注意的有两点:

  • 1.第二个参数不仅可以传入类,也可以传入由类组成的元组。
  • 2.一个类被判定为自身的子类,也就是说这两个参数传入同一个类时,也会返回True。
print(issubclass(Parent,Parent))
'''
True
'''

2、isinstance(object,classinfo)

判断一个对象是否为一个类的实例对象,如果是则返回True,反之则返回False。

class Parent:
  pass
class Child:
  pass
p = Parent()
c = Child()
print(isinstance(p,Parent,Child))
#True
print(isinstance(c,Parent))
#False

需要注意的有两点:

  • 1.第二个参数不仅可以传入类,也可以传入由类组成的元组。
  • 2.如果第一个参数传入的不是一个对象,则总是返回False。

3、hasattr(object,name)

判断一个实例对象中是否包含一个属性,如果是则返回True,反之则返回False。

class Parent:
  height = 100
p = Parent()
print(hasattr(p,'height'))
'''
True
'''

需要注意的是第二个参数name必须为字符串形式传入,如果不是则会返回False。

以上就是简述 Python 的类和对象的详细内容,更多关于Python 的类和对象的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
本地文件上传到七牛云服务器示例(七牛云存储)
Jan 11 Python
基于Python实现的扫雷游戏实例代码
Aug 01 Python
在Python的Django框架中创建和使用模版
Jul 15 Python
Python找出list中最常出现元素的方法
Jun 14 Python
Python实现将SQLite中的数据直接输出为CVS的方法示例
Jul 13 Python
Android分包MultiDex策略详解
Oct 30 Python
用Python PIL实现几个简单的图片特效
Jan 18 Python
pyqt5实现登录界面的模板
May 30 Python
anaconda如何查看并管理python环境
Jul 05 Python
python openvc 裁剪、剪切图片 提取图片的行和列
Sep 19 Python
pytorch的梯度计算以及backward方法详解
Jan 10 Python
jupyternotebook 撤销删除的操作方式
Apr 17 Python
DRF框架API版本管理实现方法解析
Aug 21 #Python
Django rest framework分页接口实现原理解析
Aug 21 #Python
Python -m参数原理及使用方法解析
Aug 21 #Python
python使用布隆过滤器的实现示例
Aug 20 #Python
QT5 Designer 打不开的问题及解决方法
Aug 20 #Python
Python配置pip国内镜像源的实现
Aug 20 #Python
Python使用lambda抛出异常实现方法解析
Aug 20 #Python
You might like
php中异常处理方法小结
2015/01/09 PHP
php实现的mongodb操作类实例
2015/04/03 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
PHP常量及变量区别原理详解
2020/08/14 PHP
疯狂Jquery第一天(Jquery学习笔记)
2012/05/11 Javascript
使用indexOf等在JavaScript的数组中进行元素查找和替换
2013/09/18 Javascript
JavaScript插件化开发教程 (一)
2015/01/27 Javascript
网页禁用右键菜单和鼠标拖动选择方法小结
2015/02/25 Javascript
js css实现垂直方向自适应的三角提示菜单
2016/06/26 Javascript
完美解决IE不支持Data.parse()的问题
2016/11/24 Javascript
w3c编程挑战_初级脚本算法实战篇
2017/06/23 Javascript
前端html中jQuery实现对文本的搜索功能并把搜索相关内容显示出来
2017/11/14 jQuery
基于axios封装fetch方法及调用实例
2018/02/05 Javascript
微信小程序实现人脸识别
2018/05/25 Javascript
关于AOP在JS中的实现与应用详解
2019/05/06 Javascript
vue路由守卫及路由守卫无限循环问题详析
2019/09/05 Javascript
JS实现容器模块左右拖动效果
2020/01/14 Javascript
OpenCV-Python 摄像头实时检测人脸代码实例
2019/04/30 Python
通过python连接Linux命令行代码实例
2020/02/18 Python
python微信公众号开发简单流程实现
2020/03/09 Python
django admin管理工具自定义时间区间筛选器DateRangeFilter介绍
2020/05/19 Python
keras中模型训练class_weight,sample_weight区别说明
2020/05/23 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
2020/08/17 Python
LINUX下线程,GDI类的解释
2016/12/14 面试题
《与象共舞》教学反思
2014/02/24 职场文书
产品售后服务承诺书
2014/05/21 职场文书
自强自立美德少年事迹材料
2014/08/16 职场文书
2014年导购员工作总结
2014/11/18 职场文书
教代会闭幕词
2015/01/28 职场文书
物流业务员岗位职责
2015/04/03 职场文书
后天观后感
2015/06/08 职场文书
农村老人去世追悼词
2015/06/23 职场文书
2015年国庆节新闻稿
2015/07/18 职场文书
医学生自荐信范文(2016精选篇)
2016/01/28 职场文书
html5调用摄像头实例代码
2021/06/28 HTML / CSS