一.多态
1.概念:不同类实例化得到的对象,调用同一方法,执行逻辑不同
2.指出对象如何通过它们共同的属性/动作来操作/访问,而无需考虑具体的类
3.表明动态/运行时绑定存在,允许重载及运行时确定
class H2O:
def __init__(self,name,temperature):
self.name=name
self.temperature=temperature
def turn_ice(self):
if self.temperature<0:
print('%s温度太低结冰了'%self.name)
elif self.temperature>0 and self.temperature<100:
print('%s变成水'%self.name)
elif self.temperature>100:
print('%s温度太高变成蒸汽了'%self.name)
def func(obj): #一个统一的接口
obj.turn_ice()
class water(H2O):
pass
class ice(H2O):
pass
class steam(H2O):
pass
w1=water('水',25)
i1=ice('冰',-20)
s1=steam('蒸汽',1000)
w2=water('水',101)
#统一的接口,多种实现
func(w1)#水变成水
func(w2)#水温度太高变成蒸汽了
func(i1)#冰温度太低结冰了
func(s1)#蒸汽温度太高变成蒸汽了
二.封装
1.把数据/属性放进类/对象(装),隐藏起来(封)—明确区分内外,只在内部使用,外部无法访问
2.以’_'开头的变量都应是类内部/私有的(按约定不应在外部调用,但如果在外部调用,python没有实际的限制)
3.以’__‘开头的变量被python自动重命名为’_类名 __变量名’(仅限外部,在内部仍可直接使用)
class people:
__planet='earth'
def __init__(self,id,name,age,salary):
self.name=name
self.id=id
self.age=age
self.salary=salary
print(self.__planet) #内部可以直接调用
p1=people('123456','A',30,10000)
print(p1.__planet) #报错,外部无法直接调用
print(p1._people__planet) #不报错
4.真正的封装:明确区分内外(内部可直接使用,外部无法调用),内部的实现逻辑外部无法知晓,并未封装到内部的逻辑提供一个接口给外部使用(见面向对象进阶)
class people:
__planet='earth'
def __init__(self,id,name,age,salary):
self.name=name
self.id=id
self.age=age
self.salary=salary
print(self.__planet) #内部可以直接调用
def get_planet(self): #接口函数/访问函数
print(self.__planet)
p1=people('123456','A',30,10000)
p1.get_planet() #earth
三.反射(又称自省)
1.概念:程序可以访问/检测/修改它本身状态/行为的一种能力
2.4个可以实现反射的函数:hasattr/getattr/setattr/delattr(见python函数部分)(同样适用于类)
3.优点:可以事先定义好接口,接口只有在完成后才会真正执行,实现了即插即用,这其实是一种"后期绑定"(可以事先把主要逻辑写好—只定义接口,后期再去实现接口功能)
上一段代码被修改后无需修改下一段代码
四.动态导入模块
1.m=__import __(module_name_str)
获得的只是最顶层的模块:
会执行模块t,但获得的是模块m1
2.importlib模块:
import importlib
import.import_module(module_name_str)
获得导入的模块: