元类,__call__方法和单例模式

在python中一切皆对象的概念。

举一个例子:

class Chinese:
    country=“china”
    def __init__(self, name,age,sex):        self.name=name
        self.age=age
        self.sex=sex
    def change(self):
        print(‘%s speak Chinese ‘%self.name)
#一切皆对象的原则。 那么这个类Chinese也是对象,那么他也有自己的类。那么他的类就是type

元类:类的类就是元类。

我们用class定义类的使用来生产我们自己的对象的

内置元类type是用来专门产生class定义的类的

但是如何产生的呢?

用内置的元类type,来实例化得到我们的类

class_name=("Chinese")
class_bases=(object,)#元组
class_boby=‘‘‘
country=“china”
def __init__(self, name,age,sex):     self.name=name
     self.age=age
     self.sex=sex
 def change(self):
     print(‘%s speak Chinese ‘%self.name)
 ‘‘‘#类体代码  type()#类名字 基类 和名称空间class_dic={}exec(class_boby,{},class_dic)print(class_dic)#产生了类的名称空间#类的三大要素凑齐了print(class_name,class_bases,class_dic)

#实例化了Chinese=type(class_name,class_bases,class_dic)#print(Chinese)p=Chinese(‘egon‘,18,‘male‘)print(p.name,p.age,p.sex)

我们为毛要用这种方法来自定义类呢?

是因为这样我们就了解了,类的底层原理,这样就可以控制类的定了

##储备知识__call__方法

class Foo:
    def __init__(self):#定义的时候自动触发
        pass
    def __str__(self):#在打印的时候自动触发
        pass
    def __del__(self):#在删除的时候自动触发
        pass
    def __call__(self,*args,**kwargs):#在调用的时候自动触发
        print(”__call__“)
obj=Foo()
#怎么调用?
obj(1,2,3,x=1,y=2,z=3)

3、自定义元类:

class Mymeta(type):
# # 来控制类Foo的创建
# def __init__(self,class_name,class_bases,class_dic): #self=Foo
# # print(class_name)
# # print(class_bases)
# # print(class_dic)
# if not class_name.istitle():
# raise TypeError(‘类名的首字母必须大写傻叉‘)
#
# if not class_dic.get(‘__doc__‘):
# raise TypeError(‘类中必须写好文档注释,大傻叉‘)
#
# super(Mymeta,self).__init__(class_name,class_bases,class_dic)
#
# # 控制类Foo的调用过程,即控制实例化Foo的过程
# def __call__(self, *args, **kwargs): #self=Foo,args=(1111,) kwargs={}
# # print(self)
# # print(args)
# # print(kwargs)
#
# #1 造一个空对象obj
# obj=object.__new__(self)
#
# #2、调用Foo.__init__,将obj连同调用Foo括号内的参数一同传给__init__
# self.__init__(obj,*args,**kwargs)
#
# return obj
#
#
#
# #Foo=Mymeta(‘Foo‘,(object,),class_dic)
# class Foo(object,metaclass=Mymeta):
# """
# 文档注释
# """
# x=1
# def __init__(self,y):
# self.Y=y
#
# def f1(self):
# print(‘from f1‘)
#
#
# obj=Foo(1111) #Foo.__call__()
#
# # print(obj)
# # print(obj.y)
# # print(obj.f1)
# # print(obj.x)

# 单例模式
import settings

class MySQL:
__instance=None
def __init__(self,ip,port):
self.ip=ip
self.port=port

@classmethod
def singleton(cls):
if not cls.__instance:
obj=cls(settings.IP, settings.PORT)
cls.__instance=obj
return cls.__instance

obj1=MySQL(‘1.1.1.2‘,3306)
obj2=MySQL(‘1.1.1.3‘,3307)
obj3=MySQL(‘1.1.1.4‘,3308)

# obj4=MySQL(settings.IP,settings.PORT)
# print(obj4.ip,obj4.port)

obj4=MySQL.singleton()
obj5=MySQL.singleton()
obj6=MySQL.singleton()

print(obj4 is obj5 is obj6)

原文地址:https://www.cnblogs.com/wuchenyu/p/8870802.html

时间: 2024-10-18 04:19:19

元类,__call__方法和单例模式的相关文章

Python元类__prepare__方法深入理解

学习元类的时候,对__prepare__不是很理解,书上讲解的也不是很详细,最后通过查看stackoverflow的一些帖子对该方法有了一些理解,记录如下: 先看代码: class member_table(dict): def __init__(self): self.member_names = [] def __setitem__(self, key, value): if key not in self: self.member_names.append(key) dict.__seti

自定义元类 __call__,__init__,__new__总结

只要对象能被调用 产生对象的类里必然有__call__方法 在调用类时,必定先触发type里的__call__ __call__下有: 1.产生对象的object.__new__ 2..被调用的类自己的__init__ class AA(type): def __init__(self,class_name,class_bases,class_dic): super().__init__(class_name,class_bases,class_dic) def __call__(self, *

Python类__call__()方法

在python中,创建类型的时候定义了__call__()方法,那这个类型创建出来的实例就是可调用的.例def如: class A(object): def __init__(self,name,age): self.name=name self.age=age def __call__(self): print("this is __call__ method") a=A('gt',17) a()------>this is __call__ method 原文地址:https

深刻理解Python中的元类(metaclass)以及元类实现单例模式

深刻理解Python中的元类(metaclass)以及元类实现单例模式 在看一些框架源代码的过程中碰到很多元类的实例,看起来很吃力很晦涩:在看python cookbook中关于元类创建单例模式的那一节有些疑惑.因此花了几天时间研究下元类这个概念.通过学习元类,我对python的面向对象有了更加深入的了解.这里将一篇写的非常好的文章基本照搬过来吧,这是一篇在Stack overflow上很热的帖子,我看http://blog.jobbole.com/21351/这篇博客对其进行了翻译. 一.理解

【原创】Python 对象创建过程中元类, __new__, __call__, __init__ 的处理

原始type: type是最原始的元类,其__call__方法是在你使用" t_class = type(classname_string, base_classes_tuple, attributes_dict)" 这种语法来使用时, 在__call__方法内使用又会调用type的__new__和__init__方法来创建classname_string的具体类,并初始化类信息.当type(***)调用完成, classname_string代表的类可以用来创建实例了. 元类调用过程

Python利用元类来控制实例创建

问题: 改变实例创建方式,以此来实现单例模式,缓存或者其他类似的特性. 解决方法: 如果想定制化创建实例的过程,可以通过定制一个元类并以某种方式重新实现它的__call__()方法. 单例模式实现: class Singleton(type): def __init__(self, *args, **kwargs): self.__instance = None super().__init__(*args, **kwargs) def __call__(self, *args, **kwarg

python元类深入理解

1.python 中的类 在python中,类也是一个对象,只不过这个对象拥有生成实例的能力,我们一般使用class XXX来定义一个类,在python解释器执行到这个地方的时候会自动创建出这个对象,python也为我们提供了手动创建类的方法,type().type()这个方法对我们来说并不陌生,我们所熟知的用法是:class = type(instance),当传入一个参数时,type()返回这个参数的类.而今天我们要用到的是type的另一个功能.type("classname",(

8.python之面相对象part.9(初识元类part.1)

初步认识元类 #本篇文章介绍的元类,以及type以python3以上版本为准. 一.关于元类的前言. 在python中,一切皆对象,当然,类也是一个对象. class c1: pass obj1 = c1() 从上面这段例子可以看到,obj1是c1这个类创建出来的一个对象,obj1是由c1去产生的,如果按照前面的理论来理解,类也是一个对象,那么c1是由谁创建出来的呢? #type函数可以查看类型,也可以用来查看对象的类,二者是一样的 print(type(obj1)) # 输出:<class '

Pyhton中的元类

目录 前言 一切皆对象 动态的创建类 到底什么是元类 自定义元类 为什么要用metaclass类而不是函数 结语 前言 本片文章主要是StackOverflow上关于元类解释的高赞文章的译文,顺便加了一点个人的理解. 想看原文的同学可以直接点击 What-are-metaclasses-in-python. 环境使用Python2 一切皆对象 在Python中,一切皆对象. 字符串.列表.字典和函数是对象,类也是对象.因此你可以: 把类赋值给一个变量 可以拷贝它 可以为它添加属性 可以把它作为一