多态,__new__魔术方法,单态模式---day22
1.多态
- # ### 多态:不同的子类对象,调用相同的父类方法,产生了不同的执行效果
- '''
- 关键字:继承 改写
- '''
- class Soldier():
- #攻击
- def attack():
- pass
- #撤退
- def back():
- pass
- #陆军
- class Army(Soldier):
- def attack(self):
- print("[陆军]上来拼刺刀,你捅我我捅你,一刀999")
- def back(self):
- print("[陆军]撤退就跑")
- #海军
- class AirForce(Soldier):
- def attack(self):
- print("[空军]拿起二营长的意大利炮对敌方开展猛烈攻击")
- def back(self):
- print("[空军]弃机跳伞,落地成盒")
- #实例化陆军,产生陆军士兵
- obj_army = Army()
- #实例化海军,产生海军士兵
- obj_navy = Navy()
- #实例化空军,产生空军士兵
- obj_airforce = AirForce()
- #各部分注意,等待将军的命令
- lst = [obj_army,obj_navy,obj_airforce]
- '''
- 1.全体出击
- 2.全体撤退
- 3.空军上,其他人撤
- 4.按q键退出
- '''
- sign = True
- while sign:
- num = input("将军请下令:")
- for i in lst:
- if num == "1":
- i.attack()
- elif num == "2":
- i.back()
- elif num == '3':
- if isinstance(i,AirForce):
- i.attack()
- else:
- i.back()
- elif num.upper() == 'Q':
- print("将军,您辛苦了~")
- sign = False
- break
- else:
- print("风太大,我听不见!")
- break
2. __new__魔术方法
- # ### __new__ 魔术方法
- '''
- 触发时机:实例化类生成对象的时候触发(触发时机在__init__之前)
- 功能:控制对象的创建过程
- 参数:至少一个cls接受当前的类,其他根据情况决定
- 返回值:通常返回对象或None
- '''
- #(1)基本语法
- class MyClass():
- a = 1
- other obj = MyClass()
- print(other obj)
- class MyClass1(object):
- def __new__(cls):
- print(cls)
- #(1) 借助父类object 类.方法()
- # obj = object.__new__(cls)
- # 返回本类自己的对象
- # return obj
- #(2) 返回其他类的对象
- # return other obj
- #(3)不返回任何对象
- return None
- obj = MyClass1()
- print(obj)
- #print(obj.a)
- #(2) new 方法触发时机要快于init
- '''
- __new__ 用来创建对象
- __init__ 用来初始化对象(前提得有对象)
- 先创建对象,再去初始化对象,所以new快于init
- '''
- class Boat():
- def __init__(self):
- print(2)
- def __new__(cls):
- print(1)
- return object.__new__(cls)
- obj = Boat()
- #(3) new方法的参数要和init方法参数一一对应
- #一个参数
- class Boat():
- def __new__(cls,name):
- return object.__new__(cls)
- def __init__(self,name):
- self.name = name
- obj1 = Boat('泰坦尼克号')
- print(obj1.name)
- #多个参数
- class Boat():
- def __new__(cls,*args,**kwargs):
- return object.__new__(cls)
- def __init__(self,name,a,b,c,d,e):
- self.name = name
- obj = Boat("泰坦尼克号",2,3,4,5,6)
- print(obj.name)
- #(4)注意点
- '''如果返回的不是本类的对象,不会触发__init__构造方法'''
- print("================")
- class MyClass():
- a = 1
- other_obj = MyClass()
- class Boat():
- def __new__(cls):
- return other_obj
- def __init__(self):
- print("构造方法被触发")
- obj = Boat() #不会打印 "构造方法被触发"
3.单态模式
- # ### 单态(例)模式:无论实例化多少次,都有且只有一个对象
- '''
- 目的意义:
- 为了节省内存空间,仅仅是为了调用类中的成员
- 不需要额外给该对象添加任何成员,这个场景,使用单态
- 比如:操作数据库的增删改查这样的类,是不需要的
- '''
- #(1) 基本语法
- class Singleton():
- __obj = None #定义一个私有变量
- def __new__(cls): #创建一个new方法
- if cls.__obj is None: #判断这个对象是否为None
- cls.__obj = obj.__new__(cls) #为None 就创建一个对象
- return cls.__obj #返回对象
- '''
- <__main__.Singleton object at 0x000001FB3F207278>
- 有这个对象直接返回,没这个对象,就给你创建,保证只有一个
- 第一次实例化时,if cls.__obj is None 条件为真,创建一个对象放到cls._obj,最后返回
- 第二次实例化时,if cls.__obj is None 条件为假 , 直接返回
- 第三次实例化时,if cls.__obj is None 条件为假 , 直接返回
- 第四次实例化时,if cls.__obj is None 条件为假 , 直接返回
- '''
- obj1 = Singleton()
- print(obj1)
- obj2 = Singleton()
- print(obj2)
- obj3 = Singleton()
- print(obj3)
- obj4 = Singleton()
- print(obj4)
- #(2) 单态模式 + 构造方法
- class Singleton():
- __obj = None
- def __new__(cls,*args,**kwargs):
- if cls.__obj is None:
- cls.__obj = object.__new__(cls)
- return cls.__obj
- def __init__(self,name):
- self.name = name
- obj1 = Singleton('王振')
- obj2 = Singleton('刘伟')
- print(obj1.name)
- print(obj2.name)
- #解析:
- '''
- obj1 = Singleton('王振') self.name = "王振"
- obj2 = Singleton('刘伟') self.name = '刘伟'
- obj1 和 obj2 都是同时指向同一个对象,因为对象只创建了一个
- 对象.name 是获取最后那个指向的name即为刘伟,调了两次,即都打印一样的值
- '''
总结:今天主要讲了继承的多态,__new__魔术方法,已经单态模式
多态就是不同的子类对象,调用相同的父类方法,产生了不同的执行效果
魔术方法__new__ 触发时机,在实例化生成对象的时候触发(在__init__初始化之前)
主要功能控制对象的创建过程,参数至少一个cls接收当前类,返回值,通过返回对象或None
new方法的参数要和init方法参数一一对应,注意点,如果返回的不是本类对象,就不会触发__init__构造方法
单态模式就是无论实例化多少次,都有且只有一个对象
目的是为了节省内存空间,用在仅仅是为了调用类中的成员不需要额外给该对象添加任何成员这种场景,如操作数据库的增删改查。
语法首先定义一个类,类里面定义一个私有属性并赋值为None,在创建一个new方法,传入一个cls,写个if判断,判断这个私有
变量是否为None,为None就执行if语句下的代码块,用obj.__new__(cls)创建一个对象,最后return这个对象,调用处,无论实例化多少个对象,只创建一个对象,此时都指向同一个对象
多态,__new__魔术方法,单态模式---day22的更多相关文章
- day24:多态&魔术方法__new__&单态模式
目录 1.多态 2.__new__魔术方法 2.1 关于魔术方法__new__ 2.2 基本语法 2.3 __new__ 触发时机快于构造方法 2.4 __new__ 和 __init__ 参数一一对 ...
- 032.Python魔术方法__new__和单态模式
一 __new__ 魔术方法 1.1 介绍 触发时机:实例化类生成对象的时候触发(触发时机在__init__之前) 功能:控制对象的创建过程 参数:至少一个cls接受当前的类,其他根据情况决定 返回值 ...
- Learn day7 继承(单、多、菱形)\多态\魔术方法\装饰器\异常
1.继承 1.1 单继承# ### 继承 """ (1) 单继承 (2) 多继承 至少2个类,子类和父类 一个类继承另外一个类,当前类是子类 (衍生类) 被继承的这个类是 ...
- day19-Python运维开发基础(类的魔术方法)
1. __new__魔术方法 # ### __new__ 魔术方法 ''' 触发时机:实例化类生成对象的时候触发(触发时机在__init__之前) 功能:控制对象的创建过程 参数:至少一个cls接受当 ...
- Python 基础之面向对象之常用魔术方法
一.__init__魔术属性 触发时机:实例化对象,初始化的时候触发功能:为对象添加成员,用来做初始化的参数:参数不固定,至少一个self参数返回值:无 1.基本用法 #例:class MyClass ...
- Python中的魔术方法大全
魔术方法 一种特殊的方法而已 特点 不需要人工调用,在特定时刻自动触发执行 魔术方法种类 1.__init__初始化方法******* 触发时机:实例化对象之后触发作用:为对象添加对象的所属成员参数: ...
- PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结
前 言 OOP 学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1 PHP中的抽象 ...
- Python的程序结构[1] -> 方法/Method[2] -> 魔术方法 __init__ / __del__ / __new__
魔术方法 / Magic Method 魔法方法就是可以给你的类增加魔力的特殊方法(实质应称为特殊方法,魔术方法在JavaScript中有所体现,对象具有不透明特性,而且无法在自定义对象中模拟这些行为 ...
- Python的程序结构[1] -> 方法/Method[3] -> 魔术方法 __getattr__ 与代理模式
__getattr__ 方法 __getattr__ 方法当对象调用内部属性(包括方法等)且未找到对应属性的时候会调用的特殊方法.利用这一特性,可是对函数实现一个代理模式. __getattr__方法 ...
- PHP中设计模式以及魔术方法
1.设计模式 1.1单例模式 口诀:三私一公 1.私有的静态属性用来保存对象的单例 2.私有的构造方法用来阻止在类的外部实例化 3.私有的__clone阻止在类的外部clo ...
随机推荐
- 关于IO性能的一些学习与了解
关于IO性能的一些学习与了解 摘要 最近心气不高. 学习进度也拖的比较慢. 以后想能够多为自己着想.自己有自己的节奏, 不能只为别人考虑. 要改变一下自己的做事风格. 一些事情想帮则帮, 不想帮就当看 ...
- [转帖]linux下 进程io队列,IO队列和IO调度
IO体系概览 先看看本文主题IO调度和IO队列处于整个IO体系的哪个位置,这个IO体系是非常重要的,了解IO体系我们可以对整个IO过程有个全面的认识.虽然一下两下并不清楚IO体系各个部分的细节,但是我 ...
- Linux 一行命令 仅显示某一个网卡的ip地址
最简答的方法 1. 先使用 ifconfig 查看网卡的设备名 2. 然后输入命令 ifconfig ens192 |grep 'inet ' |cut -d " " -f 10命 ...
- [3] 以逆向的角度来看循环语句——do、while、for的比较
[3] 以逆向的角度来看循环语句--do.while.for的比较 1. do循环 先执行循环体,后比较判断 #include <stdio.h> int main(int argc, ...
- pycharm像vs那样进行代码折叠
在visual studio中可以使用#region和#endregion来进行代码折叠,我尝试在pycharm中也可以使用相同的指令来折叠代码. 但是如果#endregion是在方法的最后面或者类的 ...
- TienChin 渠道管理-渠道导入
ChannelController @PostMapping("/importTemplate") void importTemplate(HttpServletResponse ...
- Pdfium.Net.Free 一个免费的Pdfium的 .net包装器--快速入门
Pdfium.Net.Free 支持 .NETFramework 4.0 .NETFramework 4.5 .NETStandard 2.0 可以和PdfiumViewer.Free共同使用预览pd ...
- 47从零开始用Rust编写nginx,配对还有这么多要求!负载均衡中的路径匹配
wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 负载均衡, 静态文件服务器,websocket代理,四层TCP/UDP转发,内网穿透等,会将实 ...
- Google_Book_20Things.前言以及前四项学习笔记
20 THINGS I LEARNED ABOUT BROWSERS AND THE WEB Illustrated by Christoph Niemann. Written by the Goog ...
- 冰点还原 deep freeze 安装,招聘机试时用到
官方地址:https://www.faronics.com https://www.bingdiancn.com/(也可以从这个网站下载,我是从这个网站下载的) 需求:招聘时 需要机试,需要做项目,为 ...