zoukankan      html  css  js  c++  java
  • 类的抽象类接口类,多态封装

    抽象类,接口类

    from abc import ABCMeta,abstractmethod
    
    
    class Payment(metaclass=ABCMeta):  # 抽象类(接口类):
        @abstractmethod
        def pay(self): pass  # 制定了一个规范,子类中没有制定的这个方法就报错
    
    
    class Alipay(Payment):
        def __init__(self,money):
            self.money = money
    
        def pay(self):
            print('使用支付宝支付了%s' %self.money)
    
    
    class Jdpay(Payment):
        def __init__(self, money):
            self.money = money
    
        def pay(self):
            print('使用京东支付了%s' % self.money)
    
    class Wechatpay(Payment):
    
        def __init__(self,money):
            self.money = money
    
        def pay(self):
            print('使用微信支付了%s' % self.money)
    
    
    def pay(obj):
        obj.pay()
    w1 = Wechatpay(200)
    a1 = Alipay(200)
    j1 = Jdpay(100)
    pay(a1)  # 归一化设计
    pay(j1)
    

      python 到处都是多态

    python有鸭子类型.
    鸭子类型 : 看着像鸭子,他就是鸭子.
    
    这些类 都互称为鸭子.
    #举例:字符串,列表,元组中都有index方法,这几个类就叫做鸭子类型.方法用一样的名字 class Str: def index(self): pass class List: def index(self): pass class Tuple: def index(self): pass

      

    广义的封装: 实例化一个对象,给对象空间封装一些属性.
    狭义的封装: 私有制.私有成员:私有静态属性,私有方法,私有动态属性
    class B:
        __money = 100000
    
    class A(B):
        name = 'alex'
        __age = 1000
    
        def func(self):
            print(self.__age)
            print(A.__age)    # 对于私有静态属性,类的内部可以访问.
            print('func....')
        def func1(self):
            print(self.__money)
            print(A.__money)
    a1 = A()
    print(a1.name)
    print(A.name)
    
    print(a1.__age)  # 实例化对象不能访问私有静态属性
    print(A.__age)  # 类名不能访问私有静态属性
    对于私有静态属性,类的外部不能访问.
    
    a1.func()
    
    对于私有静态属性,类的内部可以访问.
    
    a1.func1()
    
    对于私有静态属性来说,只能在本类中内部访问,类的外部,派生类均不可访问.
    
    可以访问,但是工作中千万不要用.
    print(A._A__age)
    print(A.__dict__)
    
    私有方法
    
    class B:
        __money = 100000
        def __f1(self):
            print('B')
    
    class A(B):
        name = 'alex'
    
        def __func(self):
            print('func....')
    
        def func1(self):
            self.__func()   # 类的内部可以访问
            self.__f1()
    a1 = A()
    a1.__func()  # 类外部不能访问
    a1.func1()  # 类的内部可以访问
    
    # 面试题
    
    class Parent:
        def __func(self):
            print('in Parent func')
    
        def __init__(self):
            self.__func()
    
    class Son(Parent):
        def __func(self):
            print('in Son func')
    
    son1 = Son()
    #实例化对象的时候先执行等号右边,然后自动执行类里面的__init__方法,
    子类中没有去父类中找,
    然后执行__func方法,
    因为私有静态属性以及方法往下走时前面自动加上_类名,因为__init__方法在Parent类中,
    所以等于执行_Parent__func方法,
    打印in Parent func

      

  • 相关阅读:
    Oracle-DQL 7- 集合操作
    Oracle-DQL 6- 子查询
    Oracle-DQL 5- 分组函数(多行函数)
    Oracle-DQL 4- 多表查询
    Oracle-DQL 3- 单行函数
    构建gulp项目
    重开Vue2.0
    ES6
    emmet简单记录
    webpack 3.X研究
  • 原文地址:https://www.cnblogs.com/duanpengpeng/p/9373031.html
Copyright © 2011-2022 走看看