• 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次;
    
  • 相关阅读:
    webservice+linq
    Javascript之四
    HTML、CSS、JS课后习作——痛风诊断APP源代码
    HTML、CSS、JS课后习作——痛风诊断APP
    Javascript之三
    Javascript之二
    Javascript之一
    CSS(之五)
    CSS(之四)
    CSS(之三)
  • 原文地址:https://www.cnblogs.com/yunchao-520/p/12980927.html
Copyright © 2020-2023  润新知