接口类
python中的接口类源于JAVA中的接口类,有一个例子:
from abc import abstractclassmethod,ABCMeta #导入这两个类 class payment(metaclass=ABCMeta): #payment元类,默认的元类 @abstractclassmethod #语法糖 def pay(self): #定义的方法,没有实现这个方法 pass class Wechat: def pay(self,money): print('Wechat支付了%s钱'%money) class Alipay: def pay(self,money): print('Alipay支付了%s钱'%money) class Appapy: def fuqian(self,money): print('fuqian支付了%s钱' % money) def paypay(pay_obj,money): #统一收银入口 pay_obj.pay(money) a=Wechat() b=Alipay() c=Appapy() paypay(c,300)
接口类的概念产生于java,python没有这个类,目的就是为了规范子类。
接口类:支持多继承,接口类中的所有方法都不能实现(源于java)
抽象类:抽象类一般都是单继承,不支持多继承,抽象类中方法可以有一些代码的实现。(源于java)
接口类的多继承
刚好满足接口隔离原则,面向对象开发的塑像,规范。
接口隔离原则:即使用多个专门的接口,而不是单一的总接口,即客户端不应该依赖那些不需要的接口(只有功能隔离开来,才能继承这个功能的所有功能)
from abc import abstractmethod,ABCMeta class Swim_Animal(metaclass=ABCMeta): @abstractmethod def swim(self):pass #必须不能执行 class Walk_Animal(metaclass=ABCMeta): @abstractmethod def walk(self):pass class Fly_Animal(metaclass=ABCMeta): @abstractmethod def fly(self):pass class Tiger(Walk_Animal,Swim_Animal): def walk(self): pass def swim(self): pass class OldYing(Fly_Animal,Walk_Animal):pass class Swan(Swim_Animal,Walk_Animal,Fly_Animal):pass
封装
广义上面向对象的封装:就是代码的保护,面向对象的思想本身就是一种只让自己的对象能调用自己类的方法。
封装:隐藏对象的属性和实现细节,仅提供公共访问方式
好处:
1、将变化隔离
2、便于使用
3、提高复用性
4、提高安全性
封装原则:
1、将不需要对外提供的内容都隐藏起来
2、把属性都有隐藏,提供对外访问方法
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、所有的私有的属性和方法等都是在变量的左边加上双下划线,包括:
1)、对象的属性
2)、对象的方法
3)、类中的静态私有属性
2、所有的私有的属性都不能在类的外部使用。
3、父类的私有属性不能被子类调用
class Room: def __init__(self,name,length,width): self.__name = name self.__length = length self.__width = width def get_name(self): return self.__name def set_name(self,newName): if type(newName) is str and newName.isdigit() == False: self.__name = newName else: print('不合法的姓名') def area(self): return self.__length * self.__width jin = Room('金老板',2,1) print(jin.area()) jin.set_name('2') print(jin.get_name())
什么时候会用到私有的属性?
1、隐藏起一个属性,不想让类的外部调用
2、我想保护这个属性,不想让属性随意被改变
3、我想保护这个属性,不被子类继承