面向对象-多态,反射

抽象父类

# 抽象父类:拥有抽象方法(子类共有的方法,但是父类不能有具体的实现体)的父类
#       抽象方法:方法名是具体的,但是实现体是抽象的(在子类中重写来具象化)# 注意点:有抽象方法的父类不能被实例化(假设能被实例化,就可以调用自己的抽象方法,没有任何意义)# 实现抽象父类的语法
import abs# abstract base class
class Sup(metaclass=abc.ABCMeta):# 抽象父类中的抽象方法,在继承它的子类中必须有自己的实现体#       -- 抽象父类中的抽象方法实现体就没有意义,实现与不实现都是pass填充@abc.abstractmethoddef func(self): passclass Sub(Sup):def func(self):# 必须重写父类的抽象方法

案例

import abc
class Quan(metaclass=abc.ABCMeta):def __init__(self, name):self.name = name# 共有方法,子类继承就可以了def run(self):print(self.name + 'running')# 抽象方法:子类必须重写@abc.abstractmethoddef chi(self): pass@abc.abstractmethoddef jiao(self): pass
​
class Dog(Quan):def kanmen(self):print(self.name + '看门')def chi(self):super().chi()print(self.name + '狗粮')def jiao(self):print('汪汪汪')
​
class Wolf(Quan):def bulie(self):print(self.name + '捕猎')def chi(self):print(self.name + '肉')def jiao(self):print('嗷嗷嗷')
​
dog = Dog('来福')
wolf = Wolf('呵呵')
​
dog.jiao()
wolf.jiao()
dog.run()
wolf.run()
View Code

多态

# 多态:对象的多种状态 - 父类对象的多种(子类对象)状态import abc
class People(metaclass=abc.ABCMeta):def __init__(self, name):self.name = name@abc.abstractmethoddef speak(self): pass
​
class Chinese(People):def speak(self):print('说中国话')
class England(People):def speak(self):print('说英国话')if __name__ == '__main__':# 多态的体现:功能或是需求,需要父类的对象,可以传入父类对象或任意子类对象#       注:一般都是规定需要父类对象,传入子类对象def ask_someone(obj):print('让%s上台演讲' % obj.name)  # 父类提供,自己直接继承obj.speak()  # 父类提供,只不过子类重写了
​ch = Chinese('王大锤')en = England('Tom')# 传入Chinese | England均可以,因为都是People的一种状态(体现方式)ask_someone(ch)ask_someone(en)# 传入str不可以,因为str的对象没有name和speak# s = str('白骨精')# ask_someone(s)# p = People('kkk')

鸭子类型

# 需求:需要一个对象,该对象有name属性及speak方法,就可以作为一种状态的体现被传入
def ask_someone(obj):print('让%s上台演讲' % obj.name)obj.speak()
​
# 鸭子类型:
# 1.先规定:有什么属性及什么方法的类的类型叫鸭子类型
# 2.这些类实例化出的对象,都称之为鸭子,都可以作为需求对象的一种具体体现
class A:# 能有自己特有的属性和方法,可以和B完全不一样,但是必须有鸭子类型规定的属性和方法,不然就不是鸭子类型def __init__(self, name):self.name = namedef speak(self):print('说AAAA')class B:# 能有自己特有的属性和方法,可以和A完全不一样,但是必须有鸭子类型规定的属性和方法,不然就不是鸭子类型def __init__(self, name):self.name = namedef speak(self):print('说BBBB')ask_someone(B('B'))

反射

# 反射:通过字符串与类及类的对象的属性(方法)建立关联
class A:num = 10
print(hasattr(A, 'num'))
res = getattr(A, 'num', '默认值')
print(res)
delattr(A, 'num')
print(setattr(A, 'tag', 10))
# 类的属性类来操作
​
​
class B:def __init__(self, name):self.name = name
print(hasattr(b, 'name'))
print(getattr(b, 'name', '对象的属性类不能获取'))
delattr(b, 'name')
print(setattr(b, 'age', 18))
# 对象的属性对象来操作
​
​
class C:def fn(self):print('fn')
​@classmethoddef func(cls):print('func')
​
fn = getattr(C, 'fn')
c = C()
fn(c)  # 类获取对象方法调用时传入具体的对象
​
obj_fn = getattr(c, 'fn')
obj_fn()  # 对象获取对象方法调用时不用传参
​
func = getattr(C, 'func')
func()  # 类获取类方法调用时不需要传入参数

转载于:https://www.cnblogs.com/penghengshan/p/10756439.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CVPR2014: DeepID解读

上周五就要发的,拖........拖.......拖到现在,文中有不准确的地方,欢迎批评指正。DeepID是一种特征提取的算法,由港中文汤晓鸥团队于2014年提出,发表于CVPR2014。其应用领域是人脸识别的子领域——人脸验证&#xff0c…

成大事必备9种能力 9种手段 9种心态(图)

成大事必备9种能力 1、摆正心态,敢于面对现实 对于那些不停地抱怨现实恶劣的人来说,不能称心如意的现实,就如同生活的牢笼,既束缚手脚,又束缚身心,因此常屈从于现实的压力,成为懦弱者;而那些…

解决:A component required a bean of type ‘javax.jms.Queue‘ that could not be found.

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 情景描述:只是想简单写个 ActiveMQ 的小样,启动服务却报错: Error starting ApplicationContext…

【计算机视觉】OpenCV篇(3) - 图像几何变换(仿射变换/透视变换)

图像的几何变换从原理上看主要包括两种:基于23矩阵的仿射变换(平移、缩放、旋转和翻转等)、基于33矩阵的透视变换。 仿射变换基本的图像变换就是二维坐标的变换:从一种二维坐标(x,y)到另一种二维坐标(u,v)的线性变换: …

OpenCL 与 CUDA

根据网站资料,简单地汇编一下CUDA与OpenCL的区别。如有错误请指出。 题外话: 美国Sandia国家实验室一项模拟测试证明:由于存储机制和内存带宽的限制,16核、32核甚至64核处理器对于超级计算机来说,不仅不能带来性能提升…

Eclipse4JavaEE安装SpringBoot

第一步:下载SpringBoot SpringBoot官网下载链接 第二步:在Eclipse里进行安装 打开Eclipse,菜单栏Help -》Install New Software,进入下图界面,点击Add 设置Name和Location,Name看自己喜好,Locat…

从零开始玩转 logback、完整配置详解

官网地址:https://logback.qos.ch/manual/index.html 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 概述 LogBack是一个日志框架,它与Log4j可以说是同出一源&a…

ActiveMQ_Windows版本的安装部署

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1, 保证电脑上安装了jdk6以上版本的java,并配置了好环境变量 ; 2, 官方下载地址:http://activemq.a…

如何将markdown转换为wxml

话说我要为技术博客写一个小程序版,我的博客解决方案是 hexo github-page,格式当然是技术控们喜欢的 markdown 了 。但小程序使用的却是独有的模版语言 WXML。我总不能把之前的文章手动转换成小程序的 wxml 格式吧,而网上也没完善的转换库&a…

巧妙喝水打败多种疾病

喝水,我们每天都会做的一件事,殊不知,喝水得当能打败多种疾病问题! 方法/步骤 一、很多人都听说过早晨喝一杯水对身体有好处,有人喝盐水?有人喝蜂蜜水?还有人为了美白喝柠檬水?到底喝什么水最好呢?人体经过了一宿的代谢&…

git 几个commit点合并成一个commit点

在用git做版本控制器的时候,经常会遇到以下情况: 1、在做1个功能的时候,你自己觉得代码没问题了,就本地commit,然后提交代码,在gitlab上发起和并请求,老大看完之后,觉得你还有修改的…

深入浅出 消息队列 ActiveMQ

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 一、 概述与介绍 ActiveMQ 是Apache出品,最流行的、功能强大的即时通讯和集成模式的开源服务器。ActiveMQ 是一个完全支持JM…

2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) - 4.28

赛后补了几道 赛中我就写了两个... A - Altruistic AmphibiansGym - 101933A 看了眼榜没几个人做。就没看。 最后发现就是一个DP(但是我觉得复杂度有点迷) 题意:$n$只青蛙有参数$l,w,h$分别表示弹跳力,体重,身高&#…

消息队列技术介绍 : ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ

一、 消息队列概述 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合、异步消息、流量削锋等问题。实现高性能、高可…

python爬虫学习之页面登陆

爬虫学习的一点心得 登陆主要有3种方法:使用selenium,cookies,模拟表单登陆 个人对于一般情况使用cookies登陆 可以实现一次手动,长期自动,可以绕过登陆(登陆的相关信息密码,账号等会存于cookie…

消息队列 应用场景 解析

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 另外腾讯云-云社区还有一文不允许转载,但内容挺好的:https://cloud.tencent.com/developer/article/1006035 分布…

利用memcached实现CAS单点登录集群部署

前言:利用memcached实现CAS单点登录集群部署 负载均衡:将接口请求的有状态性变成无状态性。是我们在实现负载均衡时必要要解决的问题。以应用接口的session状态为例,一般解决方法都是将session数据和应用进行剥离,session数据统一…

分布式开放消息系统 ( RocketMQ ) 的原理与实践

分布式消息系统作为实现分布式系统可扩展、可伸缩性的关键组件,需要具有高吞吐量、高可用等特点。而谈到消息系统的设计,就回避不了两个问题: 消息的顺序问题消息的重复问题RocketMQ作为阿里开源的一款高性能、高吞吐量的消息中间件&#xff…

数据结构02-链表

说明:由于该数据结构是由java并且是原生实现,所以与C有一些出入,不过原理是相同的 1.链表的定义 为了表示线性表元素a与a1的逻辑关系,存储数据时,除了存储元素本身的信息之外,还存储了直接后继元素的位置信…

洛谷P2347 砝码称重 某一年noip提高组原题

可以转化为01背包求方案数的问题&#xff0c;dp数组f[][]表示第几个砝码能称出的重量,可压缩至一维 转移方程为f(i,j)f(i-1,j-w[i]) 当前我们可以称出的重量必定是由之前的砝码重量转移过来的 #include<bits/stdc.h> using namespace std; const int N550; const int max…