一.面向对象 - 多态
不同的子类对象,调用相同的父类方法,产生了不同的执行结果
关键字: 继承 , 改写
二.魔术方法
2.1__ new __ 魔术方法
触发时机:实例化类生成对象的时候触发(触发时机在__ init __之前)
功能:控制对象的创建过程
参数:至少一个cls接受当前的类,其他根据情况决定
返回值:通常返回对象或None
1.基本语法
class MyClass1(object):
def __new__(cls):
print(cls)
# (1)借助父类object 类.方法()
# obj = object.__new__(cls)
# 返回本类自己的对象
# return obj
# (2)返回其他类的对象
# return 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()
# 打印
1
2
3 . new方法的参数要和init方法一一对应
一个参数
class Boat():
def __new__(cls,name):
return object.__new__(cls)
def __init__(self,name):
self.name = name
obj = Boat("泰坦尼克号")
print(obj.name)
多个参数(new可以用*args,**kwargs来收集参数)
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.注意点
如果new返回的不是本类的对象,则不会触发init构造方法
class MyClass():
a = 1
other_obj = MyClass()
class Boat():
def __new__(cls):
return other_obj
def __init__(self):
print("构造方法被触发~")
obj = Boat()
# 打印 啥也没有 new返回的是其他类的对象 不触发init
三.单态模式
无论实例化多少次,都有且只有一个对象
目的意义:为了节省内存空间,仅仅是为了调用类中的成员的话,不需要额外给该对象添加任何成员,在这个场景中应使用单态,比如操作数据库的增删改差这样的类.
1.基本语法
class Singleton():
__obj = None
def __new__(cls):
if cls.__obj is None:
cls.__obj = object.__new__(cls)
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)
obj1 obj2 obj3 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 是获取他后边刘伟那个值,是同一个值打印了2次;