DAY29、元类
一、eval内置函数
eval内置函数的使用场景:
1、执行字符串会得到相应的执行结果
2、一般用于类型转换,得到dict、list、tuple
例:
dic_str = ''{'a':1,'b':2}''
print(eval(dic_str)) # {'a':1,'b':2} with open(txt,'r',encoding='utf-8')as f:
data_str = f.read()
res = eval(data_str)
二、exec内置函数
exec应用场景:
1、执行字符串,没有执行结果(没有返回值)
2、将执行的字符串中产生的名字形成对应的局部名称空间
例:
s = '''
name = 'Bob'
age = 20
'''
class A:
pass
a = A()
dic = {}
exec(s,{},dic)
a.__dict__ = dic
print(a.__dict__) # {'name':'Bob','age':20}
三、type产生类
类是type的对象,可以通过type(参数)来创建类
type类叫做元类,是所有元类的基类
元类:
造类的类(类的类)
控制类的产生
控制类的对象的产生
type(name,bases,namespace)
例:
s = '''
a = 10
b = 20
def __init__(self):
pass
@classmethod
def print_msg(cls,msg)
print(msg)
'''
namespace = {}
exec(s,{},namespace)
Student = type('Student',(object,),namespace)
stu = Student()
四、自定义元类
元类:所有自定义的类本身也是对象,是元类的对象,所有自定义的类本质上是由元类实例化出来的
例:
class MyMeta(type): #在class Student时调用,来控制类的创建
# 自定义元类,重写init方法的目的
# 1、该方法是从type中继承来的,所以参数同type的init
# 2、最终的(如果开辟空间,操作内存)还是要借助type
# 3、在交给type最终完成工作之前,可以对类的创建加以限制
def __init__(cls,class_name,bases,namespace):
# 目的:对class_name | bases | namespace 加以限制
super().__init__(class_name,bases,namespace)
# 在Student()时调用:来控制对象的创建
# 自定义元类,重写call方法的目的
# 1、被该元类控制的类生成对象,会调用元类的call方法
# 2、在call中的返回值就是创建的对象
# 3、在call中:
# 通过object开辟空间产生对象
# 用被控制的类回调到自己的init方法完成名称空间的赋值
# 将修饰好的对象反馈给外界
def __call__(cls,*args,**kwargs):
# 目的:创建对象,就可以对对象加以限制
obj = object.__new__(cls) #通过object为类开辟空间
cls.__init__(obj,*args,**kwargs) # 调回当前被控制的类的自身的init方法,完成名称空间的赋值
return obj class Student(object,metaclass): # type(class_name,bases,namespace)
pass
问题:
1、继承是想获得父级的属性和方法,元类是要将类的创建和对象的创建的加以控制
2、类的创建由元类的__init__方法控制
元类(class_name,bases,namespace)=>元类.__init__来完成实例化
3、类的对象的创建由元类的__call__方法控制
对象的产生是需要开辟空间的,在__call__中用object.__new__()来完成的
五、单例
单例:一个类只能产生一个实例
为什么要有单例:
1、该类需要对象的产生
2、对象一旦产生,在任何位置实例化对象,只能得到第一次实例化出来的对象
3、在对象唯一创建后,可以通过属性修改或方法间接修改属性,来完成数据的更新,不能通过实例化方式更新数据
实现方法:
1、将类的对象当作模块导入,当第一次导入时,实例化一次对象,之后再导入时就会直接引用第一次实例化出的对象
2、约定别用类名()来实例化对象,用类方法来获取唯一对象
class Songs:
__instance = None
@classmethod
def getInstance(cls):
if cls.__instance == None:
cls.__instance = cls()
return cls.__instance
s1 = Songs.getInstance()
s2 = Songs.getInstance()
3、类一旦有__new__方法,该类的实例化有__new__来控制,不会执行 __init__
class Songs:
__instance = None
def __new__(cls,song_name,*args,**kwargs):
if cls.__instance == None:
cls.__instance = object.__new__(cls)
cls.__instance.song_name = song_name
return cls.__instance
def chang_song(self,song_name):
self.song_name = song_name
s1 = Songs('aaa')
s2 = Songs('bbb')
print(s1.song_name,s2.song_name)
s2.chang_song('bbb')
print(s1.song_name,s2.song_name)
4、装饰器
def outer(cls):
__instance = None
def inner(*args,**kwargs):
nonlocal __instance
if __instance == None:
__instance = cls(*args,**kwargs)
return __instance
return inner
@outer
class Songs:
pass
s1 = Songs()
s2 = Songs()
5、元类
class SingleMeta(type):
__instance = None
def __call__(cls,*args,**kwargs):
if SingleMeta.__instance == None:
SingleMeta.__instance = object.__new__(cls)
cls.__init__(SingleMeta.__instance,*args,**kwargs)
return SingleMeta.__instance
class Songs(metaclass=SingleMeta):
def __init__(self):
pass
s1 = Songs()
s2 = Songs()
六、面向对象方法的补充
class A:
#对象方法
def t1(self):
pass #类方法
@classmethod
def t2(cls):
pass #静态方法(最先被加载)
@staticmethod
def t3():
pass
DAY29、元类的更多相关文章
- day29 元类及异常处理
元类及异常处理 元类 什么是元类 在python中,一切皆对象,对象是由类产生的,那么类是不是对象呢? 举例: class A: pass print(type(A)) # <class 'ty ...
- day29 二十九、元类、单例
一.eval.exec内置函数 1.eval函数 eval内置函数的使用场景: ①执行字符串会得到相应的执行结果 ②一般用于类型转换得到dict.list.tuple等 2.exec函数 exec应用 ...
- python之元编程(元类实例)
本实例是元类实例,功能是记录该的子类的类名,并以树状结构展示子类的类名. RegisterClasses继承自type,提供的功能是在__init__接口,为类创建了childrens的集合,并类名保 ...
- python 元类
转载自 http://blog.jobbole.com/21351/ 类也是对象 在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大 ...
- Python语言特性之2:元类
问题:Python中的元类(metaclasses)是什么?一般使用它干什么? 原地址:http://stackoverflow.com/questions/100003/what-is-a-meta ...
- python基础——使用元类
python基础——使用元类 type() 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个Hello的class,就写一个hello. ...
- [python]python元类
这两天在看Django框架,里面的filter实现原理搞不明白,最后发现跟python的元类有关系. 原文:http://stackoverflow.com/questions/100003/what ...
- Python基础:元类
一.概述 二.经典阐述 三.核心总结 1.类的创建过程 2.元类的使用惯例 四.简单案例 1.默认行为 2.使用元类 五.实践为王 一.概述 Python虽然是多范式的编程语言,但它的数据模型却是 纯 ...
- Python中的元类和__metaclass__
1.什么是元类 元类让你来定义某些类是如何被创建的,从根本上说,赋予你如何创建类的控制权.可以把元类想成是一个类中类,或是一个类,它的实例是其它的类.当某个类调用type()函数时,你就会看到它到底是 ...
随机推荐
- springboot~thymeleaf页面布局的步骤
参考:https://ultraq.github.io/thymeleaf-layout-dialect/Installation.html 依赖包 注意里面的thymeleaf-layout-dia ...
- 浅谈基于Intellij IDEA Maven的配置与使用
在java开发中,引入jar包的方式从种类上划分,可分为自动导入和手动导入,然而,手动导入繁琐,不是很适合当前开发模式,手动导入也被自动导入所取代. 当前,Maven和Gradle是比较主流的自动导入 ...
- SAMBA服务和FTP服务讲解(week3_day1)--技术流ken
samba服务 Smb主要作为网络通信协议; Smb是基于cs架构: 完成Linux与windows之间的共享:linux与linux之间共享用NFS 第一步:安装samba [root@ken ~] ...
- .Net移动开发平台 ,基于VisualStudio的可视化开发——Smobiler平台入门教程
通过以下步骤,可以简单了解到如何下载Smobiler Designer(设计器).Client(客户端),以及如何通过设计器进行开发和调试移动应用,并在服务端部署.Cloud打包.访问您所开发的移动应 ...
- Asp.Net MVC Unobtrusive Ajax
1. Unobtrusive JavaScript介绍 说到Unobtrusive Ajax,就要谈谈UnobtrusiveJavaScript了,所谓Unobtrusive JavaScript ...
- 【spring实战第五版遇到的坑】4.2.3中LDAP内嵌服务器不启动的问题
按照4.2.3中的指导一步一步的去做,在登录界面进行登录时,报错了,报错信息是LDAP服务器连接不上. 后来查了一些资源发现还需要加入一些其他的依赖,如下: <dependency> &l ...
- 高并发系统保护~ing
由于公司业务发展,需要考虑一些高并发系统保护的问题,整理记录一下. 当发现你的系统出现访问卡顿,服务器各种性能指标接近100%(如果一个初创型企业系统正常运行情况下出现这个问题,那么应该恭喜你,你懂得 ...
- 使用Python画玫瑰花
''' Created on Nov 18, 2017 @author: QiZhao ''' import turtle # 设置初始位置 turtle.penup() turtle.left(90 ...
- Nginx + Keepalived实现应用高可用负载均衡功能
说明:此处仅介绍 Keepalived 实现nginx负载均衡器的高可用,关于nginx介绍和负载均衡实现可查看我的另两篇博文 Nginx负载均衡 和 Nginx配置了解 应用背景:实现高可用,避免单 ...
- jQuery从小白开始---初始jQuery
jQuery是什么? jQuery是一款优秀的JavaScript库,从命名可以看出jQuery最主要的用途就是用来做查询(jQuery=js+Query),正如jQuery官方Logo副标题所说(w ...