3.1.17 自定义元类控制类的实例化的应用--单实例模式

#单例模式
#实现方式一:
# class MySQL:
# __instance=None #__instance=obj1
#
# def __init__(self):
# self.host=‘127.0.0.1‘
# self.port=3306
#
# @classmethod
# def singleton(cls):
# if not cls.__instance:
# obj=cls()
# cls.__instance=obj
# return cls.__instance
#
#
# def conn(self):
# pass
#
# def execute(self):
# pass
#
#
# # obj1=MySQL()
# # obj2=MySQL()
# # obj3=MySQL()
# #
# # print(obj1)
# # print(obj2)
# # print(obj3)
#
# obj1=MySQL.singleton()
# obj2=MySQL.singleton()
# obj3=MySQL.singleton()
#
# print(obj1 is obj3)

#实现方式二:元类的方式
class Mymeta(type):
def __init__(self,class_name,class_bases,class_dic):
if not class_name.istitle():
raise TypeError(‘类名的首字母必须大写‘)

if ‘__doc__‘ not in class_dic or not class_dic[‘__doc__‘].strip():
raise TypeError(‘必须有注释,且注释不能为空‘)

super(Mymeta,self).__init__(class_name,class_bases,class_dic)
self.__instance=None

def __call__(self, *args, **kwargs): #obj=Chinese(‘egon‘,age=18)
if not self.__instance:
obj=object.__new__(self)
self.__init__(obj)
self.__instance=obj

return self.__instance

class Mysql(object,metaclass=Mymeta):
‘‘‘
mysql xxx
‘‘‘
def __init__(self):
self.host=‘127.0.0.1‘
self.port=3306

def conn(self):
pass

def execute(self):
pass

obj1=Mysql()
obj2=Mysql()
obj3=Mysql()

print(obj1 is obj2 is obj3)

原文地址:https://www.cnblogs.com/beallaliu/p/9125140.html

时间: 2024-11-09 09:04:56

3.1.17 自定义元类控制类的实例化的应用--单实例模式的相关文章

1.元类介绍/2.自定义元类控制类的行为/3.控制类的实例化行为/4.控制类的实例化行为的应用

1.元类介绍 1.储备知识exec()参数1;字符串形式得命令参数2.全局作用域(字典形式),如果不指定默认就使用globals()参数3.局部作用域(字典形式),如果不指定默认就使用locals() 2.python 一切皆对象 ,对象可以怎么用? 2.1. 都可以被引用 x=obj 2.2. 都可以当作函数得参数传入 2.3. 都可以当作函数得返回值 2.4. 都可以当作容器类得元素 li=[func,time] # 类也是对象,Foo=type() 类是属于type() 类 3.什么叫元类

2.自定义元类控制类的创建行为

工作中,现有的类可能不能满足实际的个性化需求,那么我们需要自己定义元类来控制类的行为 本篇是对自定义元类控制类的创建行为的理解 自定义元类控制类型为分创建行为和实例化行为,其中控制创建行为是通过__Init__方法实现的. 1)我们知道,根据开发规范,类的名称是要大写的,但开发者不大写当然也可以运行的 2)开发者在创建类时,最好在类中加入一些注释,方便以后回头理解,也方便产品经理的理解,当然开发者不写这些注释也没关系 现在我要告诉你,类名必须大写!新建类必须要有注释!就是这么任性,哈哈 实现代码

通过元类控制类的产生

自定义元类:来控制类的产生:可以控制类名,可以控制类的集成父类,控制类的名称空间 type 自定义元类必须集成type,写一个类继承type 这种类都叫元类 class Mymeta(type): #def __init__(self,*args,**kwargs): def __init__(self,name,bases,dic): #sef就是Person类 print(name) print(bases) print(dic) #加限制 控制类名必须以sb开头 if not name.s

通过元类控制类的调用过程

__call__ 控制类的调用过程,实际上在控制:对象的产生 class Mymeta(type): def __call__(self,*args,**kwargs): #print('xxx') return 1 class Person(object,metaclass=Mymeta): school = 'oldboy' def __init__(self,name): self.name =name def score(self): print('分数是100') p =Person(

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

#只是储备 __call__方法:# class Foo:# def __call__(self, *args, **kwargs):# print(self)# print(args)# print(kwargs)# obj = Foo()# obj(1, 2, 3, a = 5, g = 8)'''在python中一切都是对象, 此地,Foo也是对象,Foo可以加括号调用,所以 obj也可以加括号调用但是obj这个对象的类的内部必须有__call__方法,此地可以引出, Foo的元类内部也有

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

# 单例模式:对一个类多次实例化,但只实例化出同一个对象class Mymeta(type): def __init__(self,class_name,class_bases,class_dic): if not class_name.istitle(): raise TypeError('类名的首字母必须大写!') if '__doc__' not in class_dic or not class_dic['__doc__'].strip(): raise TypeError('必须有注释

Python----面向对象---自定义元类控制类的实例化行为

一.知识储备 1.__call__方法 1 class Foo: 2 def __call__(self, *args, **kwargs): 3 print(self) 4 print(args) 5 print(kwargs) 6 7 obj = Foo() 8 obj() 9 10 结果为: 11 12 <__main__.Foo object at 0x000002AFE2B4BDA0> 13 () 14 {} 实例化时传参 1 obj(1, 2, 3, a=1, b=2, c=3)

通过元类来控制类的产生

通过元类来控制类的产生 自定义元素:来控制类的产生,可以控制类名,可以控制类的继承父类,控制类的名称空间 自定义元类必须继承type,写一个类继承type 这种类都叫元类 class Mymeta(type): # def __init__(self,*args,**kwargs): def __init__(self,name,bases,dic): # self 就是Person类 print(name) print(bases) print(dic) #练习一:加限制 控制类名必须以sb开

C++ 空类及类的大小(C++面向对象模型有提及)

初学者在学习面向对象的程序设计语言时,或多或少的都些疑问,我们写的代码与最终生编译成的代码却 大相径庭,我们并不知道编译器在后台做了什么工作.这些都是由于我们仅停留在语言层的原因,所谓语言层就是教会我们一些基本的语法法则,但不会告诉我们为什么这么做?今天和大家谈的一点感悟就是我在学习编程过程中的一点经验,是编译器这方面的一个具体功能. 首先:我们要知道什么是类的实例化,所谓类的实例化就是在内存中分配一块地址. 那我们先看看一个例子: #include<iostream.h> class a {