zoukankan      html  css  js  c++  java
  • 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、我想保护这个属性,不被子类继承

  • 相关阅读:
    【docker】关于docker中挂载的解释
    【linux】centos7安装使用rz/sz命令
    【docker】 docker容器内部安装vi命令
    【docker】centOS7上部署的mysql和spring boot服务,要求,mysql的时间、java程序服务的时间和宿主机的时间完全保持一致【修改mysql时区,临时和永久】【修改spring boot配置文件时区】【修改docker启动spring boot实例程序时区】
    【docker】docker部署spring boot项目在服务器上
    【spring boot】spring boot后台时间正确,返回给前台的时间不正确,和后台差8个小时
    html页面跳转传递参数
    SpringCloud服务如何在Eureka安全优雅的下线
    使用SpringBoot Admin监控SpringCloud微服务
    对actuator的管理端点进行ip白名单限制(springBoot添加filter)
  • 原文地址:https://www.cnblogs.com/wangyuxing/p/8310751.html
Copyright © 2011-2022 走看看