面向对象--抽象类,多态,封装_weixin_30326741的博客-程序员秘密

技术标签: python  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)

w1.Wechatpay()  #到用的时候会报错,因为已经强制执行def pay()函数的方法
接口提取了一群类共同的函数,可以把接口当做一个函数的集合。

然后让子类去实现接口中的函数

二.多态

# python面向对象的三大特征之一:
# 多态: python处处是多态.
# java :强类型语言
# 这些类 都互称为鸭子.

class Str:
    def index(self):
        pass

class List:
    def abc(self):
        pass

class Tuple:
    def rrr(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()  访问类的内部
 

总结:对于私有静态字段,类的外部不能访问.而类的内部可以访问.

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.func1()  # 类的内部可以访问
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()

结果:in Parent func

 

四.补充知识点

MRO-C算法-python多继承原理
class H:

    def bar(self):
        print('F.bar')
class G(H):

    def bar(self):
        print('F.bar')
class F(H):

    def bar(self):
        print('F.bar')
class E(G):

    def bar(self):
        print('E.bar')

class D(F):

    def bar(self):
        print('D.bar')


class C(E):
    def bar(self):
        print('C.bar')


class B(D):

    def bar(self):
        print('B.bar')


class A(B, C, D):

    def bar(self):
        print('A.bar')

a = A()
print(A.mro())

流程图;

执行过程:

A(B,C,D)

首先找到A继承的三个类的深度继承顺序,放到一个列表中
L[B] = [B,D,F,H] #B往上面的继承顺序
L[C] = [C,E,G,H] #C往上面的继承顺序
L[D] = [D,F,H] #D往上面的继承顺序

第二步:A自己的广度,第一层
L[A] = [B,C,D]

每个列表的第一个元素为头部,从第一个列表的头部开始找,找其他列表中尾部是否含有
这个类名,如果没有,提取出来放到一个列表中,如果有,找下一个列表的头部,循环下去
只要提取来一个,我们就从第一个列表的头部接着重复上面的操作.
1 [B,D,F,H] [C,E,G,H] [D,F,H] [B,C,D]
2 [D,F,H] [C,E,G,H] [D,F,H] [C,D] #提取了头部的B,然后将其他列表头部的B删除,并将B放到list中
3 [D,F,H] [E,G,H] [D,F,H] [D] #因为第一个列表的D在其他列表的尾部存在,所以跳过D,然后找第二个列表的头部C,提取了头部的C,然后将其他列表头部的C删除,并将C放到list中

.......

4 [H] [H] [H] []

list = [A,B,C,D,F,E,G,H,object]

 

 



 

转载于:https://www.cnblogs.com/shuai1993/p/9373719.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30326741/article/details/98719694

智能推荐

ELF 文件数据分析: 全局变量_readelf 全局变量_hututu_404的博客-程序员秘密

先编译一个简单的 C 程序。#include <stdio.h>char* s = "Hello, World!";char* x;int i = 0x1234;int main(int argc, char* argv[]){x = "Ubuntu";printf("%s/n", s);return 0;}编译后,使用 objdump 输出 ELF Section 信息。我们通常关心只有 .text, .rodata, .data, .bss 这几个段。yu...

linux的文件指定查看工具-grep使用说明_magiclyj的博客-程序员秘密

1、使用说明:Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。grep查找是按照行单位查找。2、使用格式:grep 关键字 文件(相对路径也可以) [选项/参数] grep [选项/参数] 关键字 文件(相对路径也可

win10下keil5 编译(MDK)的时候找不到sys.o文件,运行不通过解决方法_tasking编译无法找到.o文件_weixin_42266961的博客-程序员秘密

问题解决前:解决办法:第一步:新建一个英文文件路径,如下图(例如新建一个文件路径“C:\keilpath\AppData\Local\Temp”)第二步:将系统环境变量的用户变量区域的“TEMP”和“TMP”设置为第一步创建的英文路径。如下图:2.1找到高级系统设置2.2找到环境变量2.3找到用户变量的“TEMP"和”TMP“,将路径设为自己创建的全英文路径(别忘了点击”确...

为什么python安装不了numpy库_python的numpy模块安装不成功简单解决方法总结_weixin_39707693的博客-程序员秘密

为了画个图,被numpy这个模块的安装真的折腾疯了!!!一直装不上,花了几个小时,看了网上的很多教程、方法发现总结得不是很全,这里总结一下,防止大家再出现这个问题没有解决方法。Python的魅力之一,就是拥有众多功能强大的插件,但是这些插件的寻找、安装、升级在windows系统上却非常之麻烦。首先安装完Python后需要在系统配置环境变量,接下来又要安装Setuptools,而且安装过程中还会报编...

linux下如何模拟按键输入和模拟鼠标?_linux rel_x_Just4life的博客-程序员秘密

查看/dev/input/eventX是什么类型的事件, cat /proc/bus/input/devices 设备有着自己特殊的按键键码,我需要将一些标准的按键,比如0-9,X-Z等模拟成标准按键,比如KEY_0,KEY-Z等,所以需要用到按键模拟,具体方法就是操作/dev/input/event1文件,向它写入个input_event结构体就可以模拟按键的输入了。linux/

随便推点

PHP CTF常见考题的绕过技巧_ctf php绕过_码啊码的博客-程序员秘密

1.===绕过PHP比较运算符 ===在进行比较的时候,会先判断两种字符串的类型是否相等,再比较值是否相等。只要两边字符串类型不同会返回false

linux下一般程序运行时查找动态库的顺序_Bobsweetie的博客-程序员秘密

linux下一般程序运行时查找动态库的顺序:a.根据环境变量LD_LIBRARY_PATH查找b.根据/etc/ld.so.cache查找c.查找依次在/lib和/usr/lib目录查找。a 举例:由于动态库的链接和运行时的目录是分开指定的,所以编译通过后,运行时boost库找不到的问题存在于当前工程中。解决办法就是设置外环境变量LD_LIBRARY_PATH:#e

解决 安卓9 签名校验报错_weixin_30347009的博客-程序员秘密

最讲有客户反馈签名校验失败了,后来查看发现是安卓9的系统改了方法了,调用签名校验的方法时抛出了异常java.lang.NoSuchMethodException: collectCertificates [class android.content.pm.PackageParser$Package, int]查看源码发现android-28的 PackageParserpublic stati...

深入Android系统(十)PMS-2-初始化的一些细节_pms2-什么意思_apigfly的博客-程序员秘密

permission文件的处理在PMS的构造方法中初始化了PermissionManagerService,通过PermissionManagerService.create()方法,相关调用如下: public static PermissionManagerInternal create(......) { ...... new PermissionManagerService(context, defaultGrantCallback, externalLoc

APK安装过程分析_wells_wang的博客-程序员秘密

应用程序包的安装是android的特点APK为AndroidPackage的缩写Android应用安装有如下四种方式:1.系统应用安装――开机时完成,没有安装界面2.网络下载应用安装――通过market应用完成,没有安装界面3.ADB工具安装――没有安装界面。4.第三方应用安装――通过SD卡里的APK文件安装,有安装界面,由         packageinstaller