简述 Python 的类和对象
作者:奶糖猫 发布时间:2023-05-17 12:44:23
系列最后一篇来说说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。
来源:https://mp.weixin.qq.com/s?__biz=MzA5OTIzNjE1NA==&mid=2247488172&idx=1&sn=9d32497231a26d8357a6d69e6c62cb36&utm_source=tuicool&utm_medium=referral


猜你喜欢
- 本文实例讲述了JavaScript让Textarea支持tab按键的方法。分享给大家供大家参考。具体实现方法如下:HTMLTextAreaE
- 首先我们放出tf2.0关于tf.keras.layers.Conv2D()函数的官方文档,然后逐一对每个参数的含义和用法进行解释:tf.ke
- 用类和对象实现一个银行账户的资金交易管理, 包括存款、取款和打印交易详情, 交易详情中包含每次交易的时间、存款或者取款的金额、每次交易后的余
- Python提供了一个内联模块buildin,该模块定义了一些软件开发中经常用到的函数,利用这些函数可以实现数据类型的转换、数据的计算、序列
- [1]定义:正则又叫规则或模式,是一个强大的字符串匹配工具,在javascript中是一个对象[2]特性:[2.1]贪婪性,匹配最长的[2.
- 在记忆里,关于时间方面常的SQL也就下面这两个了,大多数朋友问题中所涉及到的数据库都ACCESS的,在些,也就写出这两SQL了。年代久远,目
- 本文实例讲述了Python单链表原理与实现方法。分享给大家供大家参考,具体如下:Python实现单链表关于链表链表(Linked List)
- b.php的代码 <?php //只能通过post方式访问 if ($_SERVER['REQUEST_METHOD'
- 本文实例讲述了jQuery绑定事件监听bind和移除事件监听unbind用法。分享给大家供大家参考,具体如下:这里分别采用后bind(eve
- mysql json解析函数JSON_EXTRACTMYSQl自带的解析函数JSON_EXTRACT,用JSON_EXTRACT函数解析出来
- 爬取流程(美食区最热标签下的三个视频)在首页获取视频的编号和名字拼接成正确的url保存视频思路1.从网页中获取视频的url发现视频的url在
- 技巧1XmlNode.InnerText与.InnerXml的区别是:前者将内容中的<和>分别变成<和>,因此,希望
- 一、聚合函数聚合函数:又叫组函数,用来对表中的数据进行统计和计算,结合group by分组使用,用于统计和计算分组数据常用聚合函数count
- 我的第一个用于生产环境的perl脚本,虽然不是很优秀,但也迈出了扎实的一步 :)领导有任务,给一批IP列表,ping每一台机器,如果没有响应
- 本文实例为大家分享了opencv实现回形遍历像素算法的具体代码,供大家参考,具体内容如下代码实现# -*- coding:utf-8 -*-
- 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片
- 问题一般在服务器上进行环境安装的时候有多种方式,比如docker, conda等。conda肯使用起来更加简便,docker更适合服务器部署
- 本文实例为大家分享了Python OpenCV实现视频追踪的具体代码,供大家参考,具体内容如下1. MeanShift假设有一堆点集和一个圆
- 前言很多时候需要对自己模型进行性能评估,对于一些理论上面的知识我想基本不用说明太多,关于校验模型准确度的指标主要有混淆矩阵、准确率、精确率、
- 这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来,对,你没猜错,相信自己的英语水平。先来一个简单