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

    '''


  • 相关阅读:
    Maven的安装及更改下载仓库
    maven如何配置
    hibernate+mysql的连接池配置
    Hibernate配置方式
    如何获得Webapp的根项目路径 即ServletContext.getRealPath() 的输入参数要以"/"开头
    JAVA WEB项目中各种路径的获取
    java创建文件和目录
    Button或者ImageButton的背景设为透明或者半透明
    ScrollView中嵌套ListView的问题
    Android中RelativeLayout各个属性的含义
  • 原文地址:https://www.cnblogs.com/yuexijun/p/10326285.html
Copyright © 2011-2022 走看看