python中的多态,鸭子类型和封装
1.多态 python天生支持多态
python中天生支持多态,在其他语言中我们可能在传参的时候必须指明参数的类型才能进行传参,但是在python中不需要,例如Java中的如下情况
这是伪代码只想表达出一种情况便于理解
class Alipay:
def pay(self,money):
print('已经用支付宝支付了%s元' % money)
class Applepay:
def pay(self,money):
print('已经用applepay支付了%s元' % money)
def pay(pay_obj,money): # 统一支付入口 归一化设计
pay_obj.pay(money)
a = Alipy()
b = Applepay()
pay(a,100)
pay(b,200)
在python中上面这种情况完全是可以的,但是在Java这种强类型的语言中在定义pay函数的时候必须指明函数参数的类型,所以就必须定义一个父类来进行继承,从而达到上面的目的,例如下面的伪代码
class Payment:pass
class Alipay(Payment):
def pay(self,money):
print('已经用支付宝支付了%s元' % money)
class Applepay(Payment):
def pay(self,money):
print('已经用applepay支付了%s元' % money)
def pay(Payment pay_obj,int money): # 统一支付入口 归一化设计
pay_obj.pay(money)
2.鸭子类型
其实鸭子类型跟多态很像的 总结出一句话就是 不依赖父类的情况下实现两个相似类中的同名方法
# 如果两个类刚好相似,并不产生父类的子类的兄弟关系,而是鸭子类型
# list tuple 这种相似,是自己写代码的时候约束的,而不是通过父类约束的
# 优点 : 松耦合 每个相似的类之间都没有影响
# 缺点 : 太随意了,只能靠自觉
class List():
def __len__(self):pass
class Tuple():
def __len__(self):pass
def len(obj):
return obj.__len__()
l = Tuple()
len(l)
# # 强类型语言 多态
# # python 语言 鸭子类型
# 接口类和抽象类 在python当中的应用点并不是非常必要
3.封装
# 广义上面向对象的封装 :代码的保护,面向对象的思想本身就是一种
# 只让自己的对象能调用自己类中的方法
# 狭义上的封装 —— 面向对象的三大特性之一
# 属性 和 方法都藏起来 不让你看见
class Person:
__key = 123 # 私有静态属性
def __init__(self,name,passwd):
self.name = name
self.__passwd = passwd # 私有属性
def __get_pwd(self): # 私有方法
return self.__passwd #只要在类的内部使用私有属性,就会自动的带上_类名
def login(self): # 正常的方法调用私有的方法
self.__get_pwd()
alex = Person('alex','alex3714')
print(alex._Person__passwd) # _类名__属性名
print(alex.get_pwd())
# 所有的私有 都是在变量的左边加上双下划綫
# 对象的私有属性
# 类中的私有方法
# 类中的静态私有属性
# 所有的私有的 都不能在类的外部使用
下面几种情况可以考虑使用封装
1.隐藏一个属性不希望外部调用
2.我想保护这个属性,不让属性随意被改变
3.我想保护这个属性,不让子类调用
总结
接口类 抽象类
python中没有接口类,有抽象类,abc模块中的metaclass = ABCMeta,@abstructmethod
本质是做代码规范用的,希望在子类中实现和父类方法名字完全一样的方法
在java的角度上看 是有区别的
java本来就支持单继承 所以就有了抽象类
java没有多继承 所以为了接口隔离原则,设计了接口这个概念,支持多继承了
python及支持单继承也支持多继承,所以对于接口类和抽象类的区别就不那么明显了
甚至在python中没有内置接口类
多态和鸭子类型
多态 —— python天生支持多态
鸭子类型 —— 不依赖父类的情况下实现两个相似的类中的同名方法
封装 —— 私有的
在python中只要__名字
在python中只要__名字,就把这个名字私有化了
私有化了之后 就不能能从类的外部直接调用了
静态属性 方法 对象属性 都可以私有化
这种私有化只是从代码级别做了变形,并没有真的约束
变形机制 _类名__名字 在类外用这个调用,在类的内部直接__名字调用