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

    1,抽象类,接口类:制定一个规范.

    • 1.1>继承有两种用途:1>继承基类的方法,并且做出自己的改变或者拓展(代码重用)  2>声明某个子类兼容于基类,定义一个借口类Interface,接口类中定义了一些接口名(就是函数名),并且为实现借口的功能,子类继承接口类,并且实现接口中的功能
    • 1.2>抽象类:抽象类是一个特殊的类,他的特殊之处在于只能被继承,不能被实例化
    import abc
    class Payment(metaclass=abc.ABCMeta):
        all_type = "file"
        @abc.abstractclassmethod  # 定义抽象方法
        def pay(cls):  # 指定一个规范
            pass
        @abc.abstractclassmethod
        def func(cls):
            pass
    
    
    class Alipay(Payment):
        def __init__(self, money):
            self.money = money
        
        def pay(self):
            print("使用京东支付了%s" % self.money)
            
    
    class JingDDong(Payment):
        
        def __init__(self, money):
            self.money = money
        
        def pay(self):
            print("使用京东支付了%s" % self.money)
    
    
    class Wechat(Payment):
        def __init__(self, money):
            self.money = money
        
        def pay(self):
            print("用微信支付了%s" % self.money)
    
    
    a1 = Alipay(300)
    b1 = JingDDong(200)
    c1 = Wechat(100)
    
    
    def pay(obj):  # obj实例化对象
        obj.pay()  # 归一化设计(对象调用父类中的方法)
    pay(a1)
    pay(b1)
    pay(c1)

    2,多态:python中处处是多态(是有他的弱类型语言决定的,也又他的灵活性的体现)

    • 在python中,不管是什么类型,传入函数,封装到对象中都可以
    • python有多态,值不过处处体现,也就不提多态的概念了,他有鸭子类型
    • 鸭子类型:具有相同属性或特征的类称为互为鸭子类型
    class Str:
        def index(self):
            pass
    class Lst:
        def index(self):
            pass
    class Tuple:
        def index(self):
            pass
    • 字符串,列表,元组他们共有的特性是都有index索引

    3,封装:就是把把属性等内容封装起来,以后再去调用封装起来的内容

    • 3.1>广义的封装:实例化一个对象,给对象空间封装一些属性
    class Person:
        def __init__(self, name, age, sex, hobby ):
            self.name = name
            self.age = age
            self.sex = sex
            self.hobby = hobby
    # 以上是给name, age, sex, hobby广义封装了属性
    • 3.2>狭义的封装:私有制
      • 私有制成员:私有静态字段,私有放法,私有对象属性
      • 3.2.1>私有静态字段
    class A:
        __money = 1000
        def __func1(self):
            print("随心所欲")
        def func2(self):
            print(A.__money)
    class B(A):
        name = "老郑"
        __age = 500
        def func3(self):
            print(self.__money)
            print("in B")
        def func4(self):
            print(self.__age)
            print("in C")
    b = B()
    print(b.__money)  # 对象不能访问父类的私有字段
    print(b.__age)  # 对象不能访问子类的私有字段
    b.func4()  # 对象可以通过子类的方法访问子类的私有静态字段
    b.func3()  # 对象不能通过子类的方法访问父类的私有静态字段
    b.func2()  # 对象可以通过访问父类的方法去访问父类的私有静态字段
    • 3.2.2>私有方法
    class A:
        __money = 1000
    
        def __func1(self):
            print("随心所欲")
    
        def func2(self):
            self.__func1()
            print(A.__money)
    
    class B(A):
        name = "老郑"
        __age = 500
    
        def func3(self):
            print(self.__money)
            print("IN B")
    
        def func4(self):
            print(self.__age)
            print("IN  C")
    
        def __func5(self):
            print("心随我动")
    
        def func6(self):
            self.__func5()
            print("心随我动")
    
    
    b = B()
    b.__func5()  # 对象不能访问子类(本类)的私有方法
    print(B.__func5)  # 子类名(本类)不能访问本类的私有方法
    b.fonc6()  # 象可以通过本类(子类)的方法访问本类(子类)的私有方法
    b.func2()  # 对象可以通过父类的方法去访问父类的私有方法
    A.__func1()  # 父类名不能访问父类的私有方法
    B.__func5()  # 子类名(本类)不能访问子类的私有方法
    • 3.2.3>私有对象属性
    class A:
        def __init__(self):
            self.__name = "老郑"
            self.__age = 28
    
        def func1(self):
            print("self.__name")
    
    
    class B(A):
        def __init__(self):
            self.__sex = ""
            self.__hobby = "闹腾"
    
        def func2(self):
            print(self.__sex)
    
        def func3(self):
            print(self.__age)
    b = B()
    print(b.__sex)  # 对象不能再外部访问子类(本类)的私有对象属性
    print(b.__name)  # 对象不能在外部访问父类的私有对象属性
    print(B.__hobby)  # 子类不能访问子类(本类)的私有对象属性
    print(A.__hobby)  # 父类不能访问父类(本类)的私有对象属性
    b.func2()  # 对象可以同过子类的方法来访问子类的私有对象的属性
    b.func3()  # 对象不能通过子类的方法去访问父类的私有属性
    b.func1()  # 对象可以通过父类的方法去访问父类的私有对象属性
    • 对于这些私有成员,他们只能在类的内部使用,不能在类的外部使用,或者派生来中使用
     
  • 相关阅读:
    模块与包的导入
    递归
    day04
    装饰器2_根据认证来源判断用户和计算登录时间
    装饰器1_统计时间函数装饰欢迎登录函数
    tail -f a.txt | grep 'python'
    函数
    内置函数1
    python模块整理
    VBS恶作剧代码
  • 原文地址:https://www.cnblogs.com/ljc-0923/p/9378735.html
Copyright © 2011-2022 走看看