简述 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 相关文章推荐
python使用wmi模块获取windows下硬盘信息的方法
May 15 Python
Swift 3.0在集合类数据结构上的一些新变化总结
Jul 11 Python
python PyTorch参数初始化和Finetune
Feb 11 Python
详解如何在python中读写和存储matlab的数据文件(*.mat)
Feb 24 Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
Jul 04 Python
python梯度下降法的简单示例
Aug 31 Python
Python3.5实现的三级菜单功能示例
Mar 25 Python
Python3.7安装keras和TensorFlow的教程图解
Jun 18 Python
opencv3/C++ 平面对象识别&amp;透视变换方式
Dec 11 Python
Python+OpenCV+图片旋转并用原底色填充新四角的例子
Dec 12 Python
使用 pytorch 创建神经网络拟合sin函数的实现
Feb 24 Python
python try...finally...的实现方法
Nov 25 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在apache环境下实现gzip配置方法
2015/04/02 PHP
yii实现使用CUploadedFile上传文件的方法
2015/12/28 PHP
php基于闭包实现函数的自调用(递归)实例分析
2016/11/11 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
php微信公众号开发之图片回复
2018/10/20 PHP
PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
2019/06/03 PHP
解决tp5在nginx下修改配置访问的问题
2019/10/16 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
JavaScript的public、private和privileged模式
2009/12/28 Javascript
通过jQuery打造支持汉字,拼音,英文快速定位查询的超级select插件
2010/06/18 Javascript
window.returnValue使用方法示例介绍
2014/07/03 Javascript
jQuery入门之层次选择器实例简析
2015/12/11 Javascript
js实现滚动条滚动到某个位置便自动定位某个tr
2021/01/20 Javascript
jQuery操作动态生成的内容的方法
2016/05/28 Javascript
AngularJs  Using $location详解及示例代码
2016/09/02 Javascript
JS基于正则表达式的替换操作(replace)用法示例
2017/04/28 Javascript
EasyUI中的dataGrid的行内编辑
2017/06/22 Javascript
vue实现全选和反选功能
2017/08/31 Javascript
详解vue-cli+es6引入es5写的js(两种方法)
2019/04/19 Javascript
VUE前后端学习tab写法实例
2019/08/06 Javascript
JS常用排序方法实例代码解析
2020/03/03 Javascript
js异步接口并发数量控制的方法示例
2020/11/22 Javascript
[04:00]DOTA2解说界神雕侠侣 CJ第四天谷子现场过生日
2013/07/30 DOTA
[04:29]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/02/01 DOTA
简单的连接MySQL与Python的Bottle框架的方法
2015/04/30 Python
Python封装shell命令实例分析
2015/05/05 Python
python socket网络编程之粘包问题详解
2018/04/28 Python
python将字符串list写入excel和txt的实例
2019/07/20 Python
一文了解python 3 字符串格式化 F-string 用法
2020/03/04 Python
香港No.1得奖零食网:香港零食大王
2016/07/22 全球购物
澳大利亚购买最佳炊具品牌网站:Cookware Brands
2019/02/16 全球购物
找工作最新求职信
2013/12/22 职场文书
开办加工厂创业计划书
2014/01/03 职场文书
吨的认识教学反思
2014/04/27 职场文书
党委班子纠正“四风”问题整改措施
2014/10/28 职场文书
2014年度安全工作总结
2014/12/04 职场文书