zoukankan      html  css  js  c++  java
  • 自定义元类控制类的实例化行为的应用

    #实现方式一
    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最后返回给其他外部要实例化的对象

    '''


  • 相关阅读:
    ScrollView 实现循环轮播
    UINavigationController和UITabBarController合用
    iOS开发网络篇—网络编程基础
    iOS开发网络篇—搭建本地服务器
    iOS开发网络篇—HTTP协议
    iOS开发网络篇—GET请求和POST请求
    UIView
    iOS准备程序
    iOS小程序-混合计算器
    IOS入门-计算机小程序
  • 原文地址:https://www.cnblogs.com/yuexijun/p/10326285.html
Copyright © 2011-2022 走看看