面向对象 魔法方法 单例(五)

类的内置方法(魔法方法)

内置方法(魔法方法)

凡是在类内部定义的,以–开头–结尾的方法,都是类的内置方法,也称之为魔法方法。

类的 内置方法,会在某种条件满足下自动触发

内置方法如下

–new–:在–init–触发前,自动触发。调用该类时,内部会通过–new–产生一个新的对象。

–init–:在调用类时自动触发,通过产生的对象自动调用–init–()

–getattr–:在‘对象.属性’获取属性时,若’属性没有’时触发

–getattrrbute–:在’对象.属性’获取属性时,无论’属性有没有’,都会触发. 注意:return self.–dict–[item] 此处不能通过对象. 属性,否则产生递归调用,程序崩溃.

注意:只要–getattr–与--getattribute同时存在类的内部,只会触发–getattribute–.

–setattr–:当’对象.属性=属性值’,添加或修改属性时触发
–call–:在调用对象‘对象 +()’时触发
–str–:在打印对象时触发,该方法必须要有一个‘字符串’返回值
–getitem–:通过对象[key]‘获取属性时触发。
–setitem–:在对象通过’对象[key]=value值’设置属性时触发

略…

单例模式

指的是在确定’类中的属性与方法’不变时,需要反复调用该类,产生不同的对象,会产生不同的内存地址,造成资源的浪费

让所有类在实例化时,指向同一个内存地址,称之为单例模式.

单例的优点:节省空间

  1. 通过classmethod

    import settings
    class MySQL:
        __instance=None
        
        def __init__(self,host,port):
            self.host = host
            self.port = port
        @classmethod
        def singleton(cls,host,port):
            if not cls.__instance:
                obj = cls(host,port)
                cls.__instance = obj
            return cls.__instance
        def start_mysql(self):
            print('启动mysql')
        def close(self):
            print('关闭mysql')
    obj1 = MySQL.singleton(settings.HOST,settings.PORT)
    print(obj1)
    obj2 = MySql.singleton(settings.HOST,settings.PORT)
    print(obj2)
    
  2. 通过装饰器实现

  3. 通过–new–实现

  4. 通过导入模块实现

  5. 通过元类实现

posted @ 2019-11-29 15:44  Mr-Allen  阅读(91)  评论(0编辑  收藏  举报