python 之 面向对象(元类、__call__、单例模式)
7.13 元类
元类:类的类就是元类,我们用class定义的类来产生我们自己的对象的,内置元类type是用来专门产生class定义的类
code="""
global x
x=0
y=2
""" #字符串内声明的名称是全局,其他为局部名称
global_dic={'x':100000}
local_dic={} # 运行字符串内代码
exec(code,global_dic,local_dic) # 把全局名称空间的名称放入global_dic,把局部的放入local_dic
print(global_dic) #{'x': 0}
print(local_dic) #{'y': 2}
7.131 用内置的元类type,来实例化得到我们的类
class_name='Chinese'
class_bases=(object,) #基类
class_body="""
country="China"
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex
def speak(self):
print('%s speak Chinese' %self.name)
"""
class_dic={}
exec(class_body,{},class_dic)
# 类的三大要素
print(class_name,class_bases,class_dic) # Chinese (<class 'object'>,) {'country':'China', '__init__': <function __init__ at ...>, 'speak': <function speak at....>}
Chinese=type(class_name,class_bases,class_dic) #实例化一个类
print(Chinese) #<class '__main__.Chinese'>
p=Chinese('egon',18,'male') #实例化对象p
print(p.name,p.age,p.sex) # egon 18 male #说明和class定义的类功能相同
7.132 __call__方法
在调用对象时自动触发__call__的执行
class Foo:
def __init__(self):
pass
def __call__(self, *args, **kwargs):# 调用对象,则会自动触发对象下的绑定方法__call__的执行,
print('__call__',*args, **kwargs)# 然后将对象本身当作第一个参数传给self,将调用对象时括号内的值传给*args与**kwargs
obj=Foo()
obj(1,2,3,a=1,b=2,c=3) #对象调用
7.133 自定义元类来控制类的创建行为
class Mymeta(type):
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=Mymeta('Foo',(object,),class_dic)
class Foo(object,metaclass=Mymeta): # metaclass=Mymeta创建自定义元类
"""
文档注释
"""
7.134 自定义元类来控制类的调用
控制类Foo的调用过程,即控制实例化Foo的过程
class Mymeta(type):
def __init__(self,class_name,class_bases,class_dic): #self=Foo
print(class_name)
print(class_bases)
print(class_dic) def __call__(self, *args, **kwargs): #self=Foo,args=(1111,) 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) #<__main__.Foo object at 0x000002019EE1BB70>
print(obj.y) #
print(obj.f1) #<bound method Foo.f1 of <__main__.Foo object at 0x000002019EE1BB70>>
print(obj.x) #
7.14 单例模式
对于对象通过相同的配置文件进行实例化,可以使几个对象使用同一个内存地址,节省内存
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.singleton() # obj4=MySQL(settings.IP,settings.PORT)
obj5=MySQL.singleton()
obj6=MySQL.singleton()
print(obj4.ip,obj4.port) # 1.1.1.1 3306
print(obj4 is obj5 is obj6) # True
python 之 面向对象(元类、__call__、单例模式)的更多相关文章
- Python之面向对象元类
		
Python之面向对象元类 call方法: class People: def __init__(self,name): self.name=name # def __call__(self, *ar ...
 - python中面向对象元类的自定义用法
		
面向对象中的常用方法 1.instance 和 issubclass instance :判断两个对象是不是一类 issubclass :判断某个类是不是另一个类的子类 #两个常用方法的使用 clas ...
 - [转]深刻理解Python中的元类(metaclass)以及元类实现单例模式
		
使用元类 深刻理解Python中的元类(metaclass)以及元类实现单例模式 在看一些框架源代码的过程中碰到很多元类的实例,看起来很吃力很晦涩:在看python cookbook中关于元类创建单例 ...
 - 深刻理解Python中的元类(metaclass)以及元类实现单例模式
		
在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Python中这一点仍 ...
 - Python元类(metaclass)以及元类实现单例模式
		
这里将一篇写的非常好的文章基本照搬过来吧,这是一篇在Stack overflow上很热的帖子,我看http://blog.jobbole.com/21351/这篇博客对其进行了翻译. 一.理解类也是对 ...
 - [Python之路] 元类(引申 单例模式)
		
一.类也是对象 当我们定义一个变量或者函数的时候,我们可以在globals()的返回值字典中找到响应的映射: def A(): print("This is function A" ...
 - python的面向对象和类
		
目录 一.基本知识点 1.面向过程编程 2.面向对象编程 3.注意 二.类的结构 1.类的理解 2.代码形式 3.类和函数的一些区别 4.类中的数据 5.类中的方法(基础) 三.类的实例化 四.类的继 ...
 - Python基础:元类
		
一.概述 二.经典阐述 三.核心总结 1.类的创建过程 2.元类的使用惯例 四.简单案例 1.默认行为 2.使用元类 五.实践为王 一.概述 Python虽然是多范式的编程语言,但它的数据模型却是 纯 ...
 - python基础——使用元类
		
python基础——使用元类 type() 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个Hello的class,就写一个hello. ...
 - 【转】Python之面向对象与类
		
[转]Python之面向对象与类 本节内容 面向对象的概念 类的封装 类的继承 类的多态 静态方法.类方法 和 属性方法 类的特殊成员方法 继承层级关系中子类的实例对象对属性的查找顺序问题 一.面向对 ...
 
随机推荐
- A1139 | 玩成模拟题的DFS
			
考试的时候有思路了,但是没写完.这题起码要40min写,思路太诡异了. 刚刚写了一段,只过了一个case,得了18分,还行.明日再战. #include <stdio.h> #includ ...
 - 洛谷P1434 [SHOI2002]滑雪
			
题目描述 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一个区域中最长 ...
 - java自动化配置工具 - autoconfig 简介
			
对于java程序员来说各种各样的配置文件是司空见惯的,比如spring的bean配置,struts的action配置等等.有些配置会随着运行环境的变化而各不相同,最典型的就是jdbc驱动的配置,在开发 ...
 - 第10组 团队Git现场编程实战
			
组员职责分工 姓名 分工 童景霖 博客 朱晓倩 制作UI 万本琳 制作UI 唐怡 制作UI 陈心怡 制作UI 黄永福 测评福州最受欢迎的商圈.后期代码修改和完善 郑志强 测评各个价位的前五美食餐厅代码 ...
 - Flink入门介绍
			
什么是Flink Apache Flink是一个分布式大数据处理引擎,可以对有限数据流和无限数据流进行有状态计算.可部署在各种集群环境,对各种大小的数据规模进行快速计算. Flink特性 支持高吞吐. ...
 - 在CentOS上使用Docker镜像安装Jenkins
			
1.必须先在CentOS上安装Docker,使用以下命名先在Docker Hub上搜索Jenkins镜像 docker search jenkins 2.下载Jenkins镜像,命令如下:(我下载的是 ...
 - 自己写的一个 CGBLIB 动态代理【原创】
			
CGLIB代理类,用CGLIB来实现一个代理类.大致原理描述如下: 1.使用Enhancer类来生成一个继续于被代理类的子类,此子类会重写被代理类(父类)中所有的非final的public方法: 2. ...
 - IM (二):数据通信协议的选择
			
https://www.jianshu.com/p/e9c2b7c48c34 http://www.52im.net/thread-283-1-1.html https://github.com/Ja ...
 - Transaction 那点事儿
			
Transaction 那点事儿 https://my.oschina.net/huangyong/blog/160012
 - IfcAxis2Placement3D
			
The IfcAxis2Placement3D provides location and orientations to place items in a three-dimensional spa ...