一、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、元类的更多相关文章

  1. day29 元类及异常处理

    元类及异常处理 元类 什么是元类 在python中,一切皆对象,对象是由类产生的,那么类是不是对象呢? 举例: class A: pass print(type(A)) # <class 'ty ...

  2. day29 二十九、元类、单例

    一.eval.exec内置函数 1.eval函数 eval内置函数的使用场景: ①执行字符串会得到相应的执行结果 ②一般用于类型转换得到dict.list.tuple等 2.exec函数 exec应用 ...

  3. python之元编程(元类实例)

    本实例是元类实例,功能是记录该的子类的类名,并以树状结构展示子类的类名. RegisterClasses继承自type,提供的功能是在__init__接口,为类创建了childrens的集合,并类名保 ...

  4. python 元类

    转载自  http://blog.jobbole.com/21351/ 类也是对象 在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大 ...

  5. Python语言特性之2:元类

    问题:Python中的元类(metaclasses)是什么?一般使用它干什么? 原地址:http://stackoverflow.com/questions/100003/what-is-a-meta ...

  6. python基础——使用元类

    python基础——使用元类 type() 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个Hello的class,就写一个hello. ...

  7. [python]python元类

    这两天在看Django框架,里面的filter实现原理搞不明白,最后发现跟python的元类有关系. 原文:http://stackoverflow.com/questions/100003/what ...

  8. Python基础:元类

    一.概述 二.经典阐述 三.核心总结 1.类的创建过程 2.元类的使用惯例 四.简单案例 1.默认行为 2.使用元类 五.实践为王 一.概述 Python虽然是多范式的编程语言,但它的数据模型却是 纯 ...

  9. Python中的元类和__metaclass__

    1.什么是元类 元类让你来定义某些类是如何被创建的,从根本上说,赋予你如何创建类的控制权.可以把元类想成是一个类中类,或是一个类,它的实例是其它的类.当某个类调用type()函数时,你就会看到它到底是 ...

随机推荐

  1. 百度地图DEMO-路线导航,测距,标点

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  2. nmon - 性能监控利器介绍

    关于nmon nmon 是一款小巧的系统监控程序(只有5000行代码),可以用来对CPU.磁盘.内存等资源指标来做实时监控. 之前在做系统性能优化工作时用得较多,觉得非常不错,于是在这里给大家介绍下用 ...

  3. 如何大幅提升web前端性能之看tengine在大公司架构实践

    在一个项目还是单体架构的时候,所有的js,css,image都会在一个web网站上,看起来并没有什么问题,比如下面这样: 但是当web网站流量起来的时候,这个单体架构必须要进行横向扩展,而在原来的架构 ...

  4. Spring Cloud Alibaba基础教程:使用Sentinel实现接口限流

    最近管点闲事浪费了不少时间,感谢网友libinwalan的留言提醒.及时纠正路线,继续跟大家一起学习Spring Cloud Alibaba. Nacos作为注册中心和配置中心的基础教程,到这里先告一 ...

  5. (转载)IQueryable和IEnumerable

    第一篇:https://www.cnblogs.com/zgqys1980/p/4047315.html: 第二篇:https://www.cnblogs.com/shenbing/p/5394228 ...

  6. 【网摘】EasyUI常用控件禁用启用方法

    1.validatebox可以用的用法:前两种适用于单个的validatebox; 第三种应用于整个form里面的输入框; <1>.$("#id").attr(&quo ...

  7. Linux IO模型(同步异步阻塞非阻塞等)的几篇好文章

    聊聊同步.异步.阻塞与非阻塞聊聊Linux 五种IO模型聊聊IO多路复用之select.poll.epoll详解 ​

  8. Openresty的同步输出与流式响应

    Openresty的同步输出与流式响应 默认情况下, ngx.say和ngx.print都是异步输出的,先来看一个例子: location /test { content_by_lua_block { ...

  9. 利用nginx 反向代理解决跨域问题

    说到nginx,不得不说真的很强大,也带来很多便利用于解决一些头疼的难题. 一般来说可以用来做:静态页面的服务器.静态文件缓存服务器.网站反向代理.负载均衡服务器等等,而且实现这一切,基本只需要改改那 ...

  10. css3 笔记 背景

    .div1 { height: 80px; background: linear-gradient( 135deg, transparent 0, transparent 49.5%, green 4 ...