python学习第22天

一.面向对象 - 多态

不同的子类对象,调用相同的父类方法,产生了不同的执行结果

关键字: 继承 , 改写

二.魔术方法

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次;
原文地址:https://www.cnblogs.com/yunchao-520/p/12980927.html