抽象类,接口类,多态,封装

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()  # 对象可以通过父类的方法去访问父类的私有对象属性
  • 对于这些私有成员,他们只能在类的内部使用,不能在类的外部使用,或者派生来中使用
 
原文地址:https://www.cnblogs.com/ljc-0923/p/9378735.html