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的更多相关文章

  1. day24:多态&魔术方法__new__&单态模式

    目录 1.多态 2.__new__魔术方法 2.1 关于魔术方法__new__ 2.2 基本语法 2.3 __new__ 触发时机快于构造方法 2.4 __new__ 和 __init__ 参数一一对 ...

  2. 032.Python魔术方法__new__和单态模式

    一 __new__ 魔术方法 1.1 介绍 触发时机:实例化类生成对象的时候触发(触发时机在__init__之前) 功能:控制对象的创建过程 参数:至少一个cls接受当前的类,其他根据情况决定 返回值 ...

  3. Learn day7 继承(单、多、菱形)\多态\魔术方法\装饰器\异常

    1.继承 1.1 单继承# ### 继承 """ (1) 单继承 (2) 多继承 至少2个类,子类和父类 一个类继承另外一个类,当前类是子类 (衍生类) 被继承的这个类是 ...

  4. day19-Python运维开发基础(类的魔术方法)

    1. __new__魔术方法 # ### __new__ 魔术方法 ''' 触发时机:实例化类生成对象的时候触发(触发时机在__init__之前) 功能:控制对象的创建过程 参数:至少一个cls接受当 ...

  5. Python 基础之面向对象之常用魔术方法

    一.__init__魔术属性 触发时机:实例化对象,初始化的时候触发功能:为对象添加成员,用来做初始化的参数:参数不固定,至少一个self参数返回值:无 1.基本用法 #例:class MyClass ...

  6. Python中的魔术方法大全

    魔术方法 一种特殊的方法而已 特点 不需要人工调用,在特定时刻自动触发执行 魔术方法种类 1.__init__初始化方法******* 触发时机:实例化对象之后触发作用:为对象添加对象的所属成员参数: ...

  7. PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

      前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象 ...

  8. Python的程序结构[1] -> 方法/Method[2] -> 魔术方法 __init__ / __del__ / __new__

    魔术方法 / Magic Method 魔法方法就是可以给你的类增加魔力的特殊方法(实质应称为特殊方法,魔术方法在JavaScript中有所体现,对象具有不透明特性,而且无法在自定义对象中模拟这些行为 ...

  9. Python的程序结构[1] -> 方法/Method[3] -> 魔术方法 __getattr__ 与代理模式

    __getattr__ 方法 __getattr__ 方法当对象调用内部属性(包括方法等)且未找到对应属性的时候会调用的特殊方法.利用这一特性,可是对函数实现一个代理模式. __getattr__方法 ...

  10. PHP中设计模式以及魔术方法

    1.设计模式        1.1单例模式        口诀:三私一公 1.私有的静态属性用来保存对象的单例 2.私有的构造方法用来阻止在类的外部实例化 3.私有的__clone阻止在类的外部clo ...

随机推荐

  1. 【转帖】nginx变量使用方法详解-6

    https://www.diewufeiyang.com/post/580.html Nginx 内建变量用在"子请求"的上下文中时,其行为也会变得有些微妙. 前面在 (三) 中我 ...

  2. React中生命周期的讲解

    什么是生命周期? 从出生到成长,最后到死亡,这个过程的时间可以理解为生命周期. React中的组件也是这么一个过程. React的生命周期分为三个阶段:挂载期(也叫实例化期).更新期(也叫存在期).卸 ...

  3. 【JS 逆向百例】某公共资源交易网,公告 URL 参数逆向分析

    声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 逆向目标 目标:某地公共资 ...

  4. NetCore高级系列文章03---中间件

    .net web 一路发展过来,经历了 .net webfrom. .net Mvc ..net core不论哪种架构,都会对用户的请求到达服务器后经历一系列类似于管道的处理.在.net webfro ...

  5. C# Contains()、 == 和Equals() 比较

    目前在开发中前端页面有搜索条件 和后端的方法进行匹配 有一个Student表,其中有字段:name.age.address.tel CREATE TABLE Student ( Name varcha ...

  6. 【Jmeter】按比例分配Api压测

    先看 [Jmeter]基础介绍-详细 [Jmeter]Request1输出作为Request2输入-后置处理器 继续聊提出的第二个问题,即 2.需要按比例分配API请求并发,以模拟真实的API压力场景 ...

  7. 7.3 Windows驱动开发:内核监视LoadImage映像回调

    在笔者上一篇文章<内核注册并监控对象回调>介绍了如何运用ObRegisterCallbacks注册进程与线程回调,并通过该回调实现了拦截指定进行运行的效果,本章LyShark将带大家继续探 ...

  8. 4.6 C++ Boost 函数绑定回调库

    Boost 库是一个由C/C++语言的开发者创建并更新维护的开源类库,其提供了许多功能强大的程序库和工具,用于开发高质量.可移植.高效的C应用程序.Boost库可以作为标准C库的后备,通常被称为准标准 ...

  9. SSD数据不能恢复?或许还有的救

    我们经常说机械硬盘相对于固态硬盘的一个优势是数据可以恢复,难道SSD固态硬盘的数据就不能恢复了吗? 这里先简单介绍一下SSD的工作方式,SSD中的数据是以电子的形式通过浮栅保存的,写入就是通过增加电压 ...

  10. Python - 将RTF文件转为Word 、PDF、HTML格式

    RTF也称富文本格式,是一种具有良好兼容性的文档格式,可以在不同的操作系统和应用程序之间进行交换和共享.有时出于不同项目的需求,我们可能需要将RTF文件转为其他格式.本文将介如何通过简单的Python ...