博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
19 抽象类 接口类 封装. 多态
阅读量:5221 次
发布时间:2019-06-14

本文共 4083 字,大约阅读时间需要 13 分钟。

主要内容:

1.  抽象类(接口类) : python没有接口这个概念.只是制定一个规范.  

  制定一个规范  :凡是继承我的类,必须有我规定的方法.

  第一版:

class Alipay:    def __init__(self,money):        self.money = money    def pay(self):        print('用支付宝花了%s钱' % self.money)class Jdpay:    def __init__(self,money):        self.money = money    def pay(self):        print('在京东花了%s钱' % self.money)a1 = Alipay(100)j1 = Jdpay(200)a1.pay()j1.pay()

   第二版:支付方式一样

class Alipay:    def __init__(self,money):        self.money = money    def pay(self):        print('用支付宝花了%s钱' % self.money)class Jdpay:    def __init__(self,money):        self.money = money    def pay(self):        print('在京东花了%s钱' % self.money)def pay(obj):    obj.pay()a1 = Alipay(100)j1 = Jdpay(200)pay(a1)             #归一化设计.pay(j1)

  第三版:野生程序员来了...  添加一个微信支付的功能

# 野生程序员来了,....增加一个微信支付的功能class Alipay:    def __init__(self,money):        self.money = money    def pay(self):        print('用支付宝花了%s钱' % self.money)class Jdpay:    def __init__(self,money):        self.money = money    def pay(self):        print('在京东花了%s钱' % self.money)class Wechatpay:    def __init__(self,money):        self.money = money    def weixinpay(self):      #对于具有相同功能的方法,尽量使用同一个名字.        print('使用微信支付了%s' % self.money)def pay(obj):    obj.pay()a1 = Alipay(100)j1 = Jdpay(200)w1 = Wechatpay(300)a1.pay()j1.pay()w1.weixinpay()

  第四版:重新修改,制定规则,抽象类,接口类.

from abc import ABCMeta,abstractmethodclass Payment(metaclass=ABCMeta):      #定义一个模块,强制使用pay,派生类中不适用会报错.    @abstractmethod    def pay(self):passclass 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()a = Alipay(200)j = Jdpay(500)w = Wechatpay(300)pay(a)pay(j)pay(w)

2.  多态:python处处是多态,没有多态的事例.         python:弱类型语言.

  java:强类型语言.

  python不管是什么类型,传入函数,封装到对象都可以.

  Pyhon不支持Java和C#这一类强类型语言中多态的写法,但是原生多态,其Python崇尚“鸭子类型”

       鸭子类型: 看着像鸭子,其实就是鸭子.

  这些类:都互称为鸭子类型.

class Str:    def index(self):        passclass List:    def index(self):        passclass Tuple:    def index(self):        pass

3.  封装

  广义的封装 : 实例化一个对象,给对象空间封装一些属性.给类中封装静态字段.

  狭义的封装 : 私有制

  私有成员:  私有静态字段  , 私有方法,   私有对象属性.

  a:   私有静态字段:类的内部可以访问,类的外部不可以访问.

        对于私有静态字段来说,只有在本类中内部访问,类的外部,派生类均不可访问.

class B:    __money = 1000class A(B):    name = 'lily'    __age = 20    def func(self):        print(self.__age)  #在类的内部实例化对象可以访问私有静态字段.        print(A.__age)     #在类的内部类名可以访问私有静态字段.    def func1(self):        # print(self.__money)  #对于私有静态字段,只有本类中内部可以访问,类的外部派生类都不可以.        # print(A.__money)        passa1 = A()a1.func()# print(a1.__age)    #在类的外部,实例化对象不能访问类中的私有静态字段# print(A.__age)     #在类的外部,类名不能访问私有静态字段a1.func1()

  b: 私有方法:类的内部可以访问,类的外部和派生类都不可以访问.

class B:    __money = 1000    def __fn(self):        print('B')class A:    name = 'lily'    __age = 20    def __func(self):        print('func,,,,')    def func1(self):        self.__func()    #在类的内部可以访问私有方法.        # self.__fn()    #在类的外部.派生类均不可以访问静态方法.a1 = A()# a1.__func()           #类的外部不可以访问私有方法a1.func1()# print(B._B__money)   #尽量不要用.# print(a1._A__age)# print(A._A__age)a1._A__func()A._A__func(1)          #类名去访问类中的方法.一定要传参数.

 c :  私有对象属性:在类的内部可以访问.在类的外部派生类都不可以访问.

class Foo:    def __init__(self,name,age,sex):        self.__name = name        self.__age = age        self.sex = sex    def fn(self):        print(f1.__name)     #在类的内部可以实现f1 = Foo('alex',23,'nan')print(f1.__dict__)print(f1.sex)f1.fn()print(f1.__age)            #在类的外部不可以实现.

 d : 面试题:

class Parent:    def __func(self):     #_Parent__func        print('in Parent func')    def __init__(self):        self.__func()class Son(Parent):    def __func(self):        print('in Son func')son1 = Son()     #实例化一个对象son1,自动执行_init_方法,  执行self.__func(),内部实际self._Parent__func                 #子类中没有,然后执行  'in parent func'print(Parent.__dict__)

  

 

 

 

 

  

 

转载于:https://www.cnblogs.com/gyh412724/p/9371352.html

你可能感兴趣的文章
CoreData 从入门到精通(四)并发操作
查看>>
Swift - UIView的常用属性和常用方法总结
查看>>
Swift - 异步加载各网站的favicon图标,并在单元格中显示
查看>>
Java编程思想总结笔记Chapter 5
查看>>
[LeetCode]662. Maximum Width of Binary Tree判断树的宽度
查看>>
WinForm聊天室
查看>>
【Python学习笔记】1.基础知识
查看>>
梦断代码阅读笔记02
查看>>
selenium学习中遇到的问题
查看>>
大数据学习之一——了解简单概念
查看>>
Linux升级内核教程(CentOS7)
查看>>
Lintcode: Partition Array
查看>>
分享适合个人站长的5类型网站
查看>>
类别的三个作用
查看>>
【SICP练习】85 练习2.57
查看>>
runC爆严重安全漏洞,主机可被攻击!使用容器的快打补丁
查看>>
Maximum Product Subarray
查看>>
solr相关配置翻译
查看>>
通过beego快速创建一个Restful风格API项目及API文档自动化(转)
查看>>
解决DataSnap支持的Tcp长连接数受限的两种方法
查看>>