zoukankan      html  css  js  c++  java
  • Python 面向对象编程的一些特征 及 单例模式的实现, 父类方法的调用(python2/python3)

    一.面向对象编程几个特征(封装, 继承,多态)

    1.封装:类里面封装函数和变量, 在将类进行实例化成实例对象时进行传参, 从而生成不同的实例对象,增加代码的复用.
    2.继承:子类可以继承父类的方法和属性.
    3.多态建立在继承的基础之上, 先有继承 才能有多态, 指子类继承父类后分别重写覆盖了父类方法.即父类的同一个方法, 在不同的子类当中表现出不同的形式

    二.类对象

      由python解释器根据class代码自动生成的一个对象, 由所有的实例对象共享

    三.__new__()方法的作用

      用于创建新的实例对象, 当需要创建实例对象时自动执行

    四.__init__()方法的作用

      在__new__()方法创建出来了实例对象后, 就会调用 __init__()方法, 对这个已经实例化的对象进行属性的初始化

    五.单例模式的实现:(通过重写__new__()实现单例模式) 

    class Item(object):
    
        __instance = None # 定义一个类属性
     
        def __new__(cls, *args, **kwargs): # 重写父类的__new__()方法, cls 指代当前类对象本身, __new__()是一个类方法
            if not cls.__instance: # 如果__instance类属性没有进行赋值, 就调用父类的__new__()方法创建一个实例化的对象,并赋值给 __instance
                cls.__instance = object.__new__(cls)
            return cls.__instance # 将该实例对象进行返回, 如果__instance已经被赋值了, 就返回已经存在的__instance所指向的实例对象,从而实现单例
    
    obj = Item()
    print(id(obj))
    
    obj2 = Item()
    print(id(obj2))

    进行输出, 发现虽然进行了两次类的实例化, 但是他们的内存id是一样的, 可以证明得到的是同一个实例对象, 单例需求得到实现:

    4449800144
    4449800144

    注意:

    1.只重写父类的__new__()方法实现单例的缺陷:

    仍然可以通过调用__init__()方法, 修改已经初始化的属性, 如果需要设置初始化的属性也不可以修改, 需要改造__init__()方法:

    class Item(object):
    
        __instance = None
        __flag = False
    
        def __new__(cls, *args, **kwargs):
            if not cls.__instance:
                cls.__instance = object.__new__(cls)
            return cls.__instance
    
        def __init__(self, name): # self 指向所实例化的对象本身
            if not self.__flag:
                self.name = name
                self.__flag = True

    obj = Item("lowman")
    print(obj.name)

    obj2 = Item("isbusy")
    print(obj2.name)

    输出:

    lowman
    lowman

    第二次重新赋值没有生效, 需求实现

    六.python2 与python3 调用父类方法(使用super()方法调用父类方法更加节省资源)

      在子类的方法中直接使用super()调用父类的方法即可

      python3: super().__init__(*args, **kwargs)

      python2: super("当前类名", self).__init__(*args, **kwargs)

        

  • 相关阅读:
    旋转坐标转换的矩阵推导
    Union的妙用和注意
    OpenGL环境搭建Windows+Mac+Linux
    RichLabel基于Cocos2dx+Lua v3.x
    Cocos2dx+lua中Color参数的坑
    常见开源协议
    lua序列化(支持循环引用)
    lua标签解析器
    Markdown基本语法
    python3爬取墨迹天气并发送给微信好友,附源码
  • 原文地址:https://www.cnblogs.com/lowmanisbusy/p/10212682.html
Copyright © 2011-2022 走看看