• 自定义元类控制类的实例化行为的应用


    #实现方式一
    class Mysql:
    __instance = None # __instance = s
    def __int__(self):
    self.post = 1.235
    self.host = 3
    @classmethod
    def singleton(cls):
    if not cls.__instance:
    obj = cls()
    cls.__instance = obj
    return cls.__instance
    def talk(self):
    pass
    def func(self):
    pass
    s = Mysql.singleton()
    d = Mysql.singleton()
    f = Mysql.singleton()
    a = Mysql.singleton()
    print(s is a)

    '''
    这是单例模式, 如果每个对象中的属性相同, 就可以用这种办法,每次用类去调用类的函数属性进行执行
    首次执行会把__instance = obj 自此以后就会把这个类的变量属性返回给其他的对象,因此无论产生再多的对象他们都是使用的第一个对象
    '''

    #实现方式二
    class Mymeta(type):
    def __init__(self, class_name, class_bases, class_dic):
    super(Mymeta, self).__init__(class_name, class_bases, class_dic)
    self.__instance = None
    print(self)
    def __call__(self, *args, **kwargs):
    if not self.__instance:
    obj = object.__new__(self)
    self.__init__(obj)
    self.__instance = obj
    print(self)
    return self.__instance

    class Mysql(object, metaclass=Mymeta):
    def __int__(self):
    self.post = 1.235
    self.host = 3
    def talk(self):
    pass
    def func(self):
    pass

    s = Mysql()
    d = Mysql()
    f = Mysql()
    print(s is f)
    '''
    元类也可以实现单例模式,同时还是需要遵循__call__里面的三原则:生产对象,初始化对象,返回对象
    此时我们在Mysql的自定义元类的Mymeta里面为Mysql的对象self生成一个空属性__instance = None ,此时我们
    定义的Mysql类如果实例化就会激活__call__ 随之我们在__casll__里面进行单例模式的实现, 判断__instance是否为空, 如果空我们就开始创建空对象,随之我们需要对空对象实例化,然后把空对形象赋值给__instance最后返回给其他外部要实例化的对象

    '''


  • 相关阅读:
    你的程序员女孩「GitHub 热点速览 v.22.09」
    高手过招不用鼠标,一款超好用的跨平台命令行界面库
    程序员的情人节「GitHub 热点速览 v.22.07」
    火爆的文字游戏你玩了吗?「GitHub 热点速览 v.22.06」
    SpringBoot入门
    将Bean放入Spring容器中的五种方式
    retransformClasses代码增强摘要
    网路代理技术
    Linux版钉钉使用
    deepin 创建桌面图标
  • 原文地址:https://www.cnblogs.com/yuexijun/p/10326285.html
Copyright © 2020-2023  润新知