1、对多态的理解:多态和继承不分家,多态实际上是依附于继承的两种含义的,“改变”和”扩展“,多态就是继承的两层含义的一个具体实现机制。即:调用不同的类实例化对象下的相同方法,实现的过程不一样。
多态的具实例:以水的三种形态为例
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<0:
print("%s温度太高变成了水蒸气"%self.name)
class Water(H2O):
pass
class Ice(H2O):
pass
class Stream(H2O):
pass
a=Water("水",28)
b=Ice("冰",-20)
c=Steam("蒸汽",2000)
2、封装:封装的意义在于隐藏,”封”指的封闭,“装”指的是把东西装进去,类的属性就好比东西,类就相当于封装东西的容器。
3、封装的三种层面:
(1)第一个层面:类就是一个麻袋,本身就是封装
(2)第二个层面:类中定义私有属性,只在内部使用,外部无法访问,这里要说到python中的两个约定(仅仅是约定而已,不做强行限制)
- 类中属性以单下划线"_"开头的,就是被隐藏起来的,但是外部还是可以调用的,python中的约定没有那么严格
- 类中属性以两个单下划线“__”开头的,外部调用会将其属性名改变。如__test=“123”,外部调用需要更名才可以访问到,名称格式为"_类名__test",可以用print(类名.dict)打印出来查看
(3)第三个层面(真正意义上的封装):只能内部访问,外部不能访问。可以写一个内部方法(接口函数),然后通过外部调用该方法执行
class test:
_a="hahaha"
def __init__(self,name,age):
self.name=name
self.age=age
#接口函数
def get_a(self):
print(_a)
p=test("Mary",18)
p.get_a()
#输出结果:hahaha