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

  • 相关阅读:
    CentOS7安装node环境
    【异常】update更新java.sql.SQLException: Duplicate entry '2019-07-30 00:00:00-110100' for key
    MySQL查询多行重复数据SQL
    Phoenix批量提交优化,官网的demo
    (转) 读懂IL
    Docker
    Docker
    Rest之路
    (转)Docker
    Docker
  • 原文地址:https://www.cnblogs.com/wangyuxing/p/8310751.html
Copyright © 2020-2023  润新知