当前位置: 首页 > 后端技术 > Python

Python类和对象介绍

时间:2023-03-26 18:32:09 Python

这篇文章讲的是Python中的类和对象。Python是一种对象无处不在的语言。如果你了解过Python,你应该听说过Python是一种面向对象的编程语言,所以你可能经常会看到“面向对象”编程这样的笑话,而面向对象的编程语言会具备三大特点:封装、继承和多态。我们平时接触到的很多函数和方法的操作都有这些属性。我们只是知道如何使用它们,而没有深入了解它的本质。下面介绍一下类和对象的相关知识。封装和封装的概念应该不陌生。比如我们把一些数据封装成一个列表,就属于数据封装。我们也可以将一些代码语句封装成一个函数,方便调用。这就是代码封装。我们也可以封装用代码打包的数据。就术语而言,可以封装属性和方法来获取对象。首先我们可以定义一个类,类里面有属性和方法,但是有些小伙伴会比较好奇,属性和方法不是封装成对象了吗,为什么又变成了类呢?比如类好比毛坯房,对象就是毛坯房改造的精装房。classXiaoMing:#attributeheight=180weight=65sex='male'#methoddefrun(self):print('小明在跑步')defsleep(self):print('小明在睡觉')completedin类定义创建类对象时,它是类定义创建的命名空间的包装器。类对象支持两种操作:属性引用和实例化。属性引用的语法是通常的标准语法:obj.name。例如XiaoMing.height和XiaoMing.run就是属性引用。前者会返回一条数据,后者会返回一个方法对象。In[1]:print(XiaoMing.height)Out[1]:180In[2]:print(XiaoMing.run)Out[2]:这里也支持类属性的赋值,对于例如,为类中的权重属性分配一个新值。In[3]:print(XiaoMing.weight)Out[3]:65In[4]:XiaoMing.weight=100In[5]:print(XiaoMing.weight)Out[5]:100类的实例化即可object被看成是赋值给局部变量的无参函数,如下:In[6]:ming=XiaoMing()ming是类对象实例化后创建的实例对象,类中的属性也可以通过调用实例对象和方法。In[7]:ming.run()Out[7]:XiaomingisrunningIn[8]:print(xiaoming.height)Out[8]:180#在调用方法返回的方法对象中输入实例classobject对象也可以达到同样的效果。In[11]:XiaoMing.run(ming)Out[11]:小明正在运行。魔术方法__init__类在实例化过程中并不总是像上面的例子那么简单。它倾向于创建具有初始状态的实例对象,因此可以在类中定义一个__init__魔术方法,它可以帮助接收和传递参数。而如果一个类定义了__init__方法,那么在类对象实例化的过程中,会自动为新创建的实例化对象调用__init__方法,请看下面的例子。classCoordinates:def__init__(self,x,y):self.x=xself.y=ydefprint_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这个新类称为子类或派生类,另一个类称为父类、基类或超类,子类继承了父类中已经存在的一些属性和方法。classMylist(list):passlist_=Mylist()list_.append(1)print(list_)'''[1]'''比如上面的例子,我没有把list_定义成列表,但是可以调用追加方法。原因是类Mylist继承自list的基类,而list_是Mylist的实例化对象,所以list_也会拥有父类list所拥有的方法。当然,两个类之间的继承关系可以通过自定义类的形式来实现。我们定义了两个类,Parent和Child。Child没有任何属性和方法,而是继承自父类Parent。classParent:defpar(self):print('父方法')classChild(Parent):passchild=Child()child.par()'''父方法'''当子类定义相同的A方法时重写或父类中同名的属性会自动覆盖父类对应的方法或属性。为了便于理解,我们用上面的例子来实现一下。classParent:defpar(self):print('Parentmethod')classChild(Parent):defpar(self):print('Subclassmethod')child=Child()child.par()'''子类方法'''可以看到子类Child中多了一个与父类Parent同名的方法,当子类实例化调用这个方法时,最终调用的是子类中的方法。Python中的继承也是允许多重继承的,也就是说一个子类可以继承多个父类的属性和方法,但是这种操作会导致代码混乱,所以大多数情况下不推荐使用,这里就不过多介绍了这里很多。多态性多态性比较简单,比如定义两个类,两个类没有关系,但是两个类中有同名的方法,当两个类的实例对象分别调用这个方法时,不同的类调用的方法也不同。classXiaoMing:defintroduce(self):print("IamXiaoming")classXiaoHong:defintroduce(self):print("IamXiaoming")上面两个类中都有introduce方法,我们可以实例化一下两个类,并使用实例对象调用这个方法来实现多态。In[12]:ming=XiaoMing()In[13]:hong=XiaoHong()In[14]:ming.introduce()Out[14]:我是小明In[15]:hong.introduce()Out[15】:我是小红。我经常用BIF1和isssubclass(class,classinfo)来判断一个类是否是另一个类的子类。如果是,则返回True,否则返回False。classParent:passclassChild(Parent):passprint(issubclass(Child,Parent))'''True'''有两点需要注意:1.第二个参数不仅可以在类中传递,还可以传递in由元组组成的类。2、一个类被确定为自己的子类,也就是说,当这两个参数传入同一个类时,它也会返回True。print(issubclass(Parent,Parent))'''True'''2.isinstance(object,classinfo)判断一个对象是否是类的实例对象,如果是则返回True,否则返回False。classParent:passclassChild:passp=Parent()c=Child()print(isinstance(p,Parent,Child))#Trueprint(isinstance(c,Parent))#False有两点需要注意:1.第二个A参数不仅可以传递给类,还可以传递给类的元组。2、如果传入的第一个参数不是对象,则一直返回False。3.hasattr(object,name)判断一个实例对象是否包含属性,如果包含则返回True,否则返回False。classParent:height=100p=Parent()print(hasattr(p,'height'))'''True'''需要注意的是第二个参数name必须以字符串形式传入,否则会返回False.