25、接口类、抽象类、多态、封装

接口类

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、我想保护这个属性,不被子类继承

 

posted @ 2018-01-22 08:27  王二黑  阅读(217)  评论(0编辑  收藏  举报