Python之类的三大特性

话不多说,直接开讲。

封装

封装,就是可以将类中的一些属性或者方法隐藏起来,在外界看不到,但是用户可以通过给出的接口来调用这部分封装的属性或者方法,这符合我们人类的处事方式,我们看电视只需要知道电视的功能而不需要知道电视机的内部是怎么运作的。
等于说就是类中的部分属性方法不需要展现给用户,只需要提供给外界一个接口,让外界在通过这个接口时,能得到运行封装起来的属性或者方法的数据就OK了。
那么封装的前提是什么,当然是隐藏了啊 ,只有在类里对数据进行隐藏,外界才不能直接调用,隐藏的方法很简单,就是再想要隐藏的属性或者方法名的前面加上两个下划线就可以了。

class Teacher:
	school = "一所大学"
	__wife = "泷泽某拉"
	
	def __init__(self,name):
		self.name = name
		
	def teacher_info(self):
		return "name:%s wife:%s"%(self.name,self.__wife) 
	

你直接问老师他的媳妇是谁,老师肯定不愿意,还怀疑你想干什么,但是你通过调取老师的信息这个接口函数,就能看到老师的媳妇是谁了。是不是很神奇?
那么把属性和方法封装起来,就真的没办法在外界调用了吗??当然不是的 ,既然想在外界调用,那么就要明白封装的原理。
封装数据是发生在类定义阶段的,也就是说当你在类外面想重新添加一个隐藏的属性是不能做到的,只有在程序丁一阶段才能将数据隐藏起来。
另一个就是类的隐藏只是改变了函数的调用方式,并不是真正意义的将数据隐藏,通过修改一下调用方式,依然能在外界调用这个属性或者方法。

class Teacher:
	school = "一所大学"
	__wife = "泷泽某拉"
	
	def __init__(self,name):
		self.name = name
		
	def teacher_info(self):
		return "name:%s wife:%s"%(self.name,self.__wife) 
	
print(Teacher._Teacher__wife)# 通过_类名__隐藏的属性或者方法就能在外界调用

当然啦,既然我们将它在类里隐藏,那么久是希望不要在外面直接调用,那么直接在外界调用就没有什么意义了。

封装的意义主要在于展现在外部的简洁化,内部所运行的程序再多,但是出现在外界的就很简单的几个接口,同时,如果是在继承中的话,还能防止父类的属性或者方法被子类的属性或者方法替换,主要还是因为两者的调用方式不同。

继承

继承最初要的作用就是减少重复代码。
站在不同的角度看世间,世间风景是不一样的,同时,我们看到的也是不一样的,首先我们看到了虫、鱼、鸟、兽,这是4个截然不同的类,好的,我们赶紧定义了四个类,然后我们又看到了琴棋书画,抓紧定义了一个琴棋书画4个类,对比我们的八个类,惊奇的发现前4个都属于有生命的,后4个是无生命的,我们又定义了两个类,但是前4个同属于有生命的类中各自又有不同的属性、方法,又有相同的属性和方法,总不能写4遍吧,这个时候,就用到了继承。
当在类定义的时候指定继承自哪个类,就会默认具备该类的所有属性和方法,B被称为子类,A被称为父类。

class A:
    school = "一所差大学"
    
    def __init__(self):
        self.grade = 60
        
class B(A):
    pass
	

当然,B 肯定不甘心啊 ,一上来就是一个差大学,如果不想要父类的一些属性或者方法,可以定义一个同名属性或者方法,就可以使用自己的了,

class A:
    school = "一所差大学"
    
    def __init__(self):
        self.grade = 60
        
class B(A):
    school = “一所好大学”
    
	def __init__(self):
        self.grade = 100

当然,还可以同时继承多个类,那时,就要涉及到一个查找顺序了,如果子类里面没有这个属性,那么去哪个类找呢?
你可以使用mro()查看属性的查找顺序,在python3中都成为新式类,默认为广度优先,需要记住,子类会优先父类被查找。
当在子类中想调用父类中的方法时,我们有两种方法 。
第一种就是直接调用父类的方法。在子类中利用(父类名.父类方法())。
第二种就是利用继承的关系来确定(super().方法名())。查找的顺序就是按照mro 列表来查找。

多态

多态:一个类可以有多种形态。
多态性:在不考虑实例类型的情况下直接使用实例。
多态性可以分为静态多态性和动态多态性。
在说多态之间,应该先介绍一下抽象类与归一化。

抽象类与归一化

抽象类就是不能被实例化只能被继承的类。
Python中并没有抽象类的概念,但是可以借助abc这个模块来实现类似的功能,所有继承抽象类的类,必须实现抽象类中定义的所有函数属性。这样多有继承抽象类的类都必须拥有这个抽象类的函数属性,在调用的时候,就可以在外界定义一个接口函数,所有继承抽象类的类都可以不考虑自己的实际类型而直接调用这个接口函数了,这样就实现了归一化的作用。

import abc

class AllFile(metaclass=abc.ABCMeta):
    all_file = "一切皆文件"
    
    @abc.abstractmethod
    def read(self):
        pass
    
    @abc.abstractmethod
    def write(self):
        pass

下面我们就了解一下什么是多态。多态就是一个类具有多种形态,“龙生九子,九子不同”大概就是这个道理了,多态性主要是在继承的背景下使用的,分为动态多态性和静态多态性。动态多态性就类似于抽象类和归一化的综合应用,静态多态性就是类似于Python函数中的+的使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值