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~Integer和int如何选择,Integer的意义何在
今天说一下自己在项目中遇到的问题,然后总结一下Integer引用类型和int值类型 关于默认值 Integer默认为null int默认为0 为什么把数据实体设计成Integer或者不是int 大叔认 ...
- LVS(二)NAT模型配置
NAT配置模式 环境说明 LVS服务器(在eth0:0上设置VIP为:192.168.159.200/24) Eth0:192.168.159.133/24 GW:192.168.159.2 Et ...
- 详解TypScript数据类型转换
最近在用TypeScript(后面简称TS),发现TS虽然语法和C#差不多但是在很多地方还是不够高级(和C#相比),这里主要聚焦在数据类型强转上面,直接看下面案例吧 string转number 案例如 ...
- SLAM+语音机器人DIY系列:(七)语音交互与自然语言处理——1.语音交互相关技术
摘要 这一章将进入机器人语音交互的学习,让机器人能跟人进行语音对话交流.这是一件很酷的事情,本章将涉及到语音识别.语音合成.自然语言处理方面的知识.本章内容: 1.语音交互相关技术 2.机器人语音交互 ...
- 一次node-sass安装记录
node-sass的版本是3.9.3 Please restart this script from an administrative PowerShell! 在当前powershell中执行下命令 ...
- c# List根据某个属性进行分类,变成以属性名称作为分类的多个List
在平时的开发中,我们从数据库中得到List列表,但是我们希望可以根据属性名称再次进行分类. 其实LINQ中已经内置相应的算法. 长话短说,直接上代码: var dataList = JsonHelpe ...
- Struts2笔记_值栈
A.值栈概述 值栈(ValueStack),通俗的来说就是Struts2里面用来管理和存储数据的东西.struts2项目部署运行后,底层会创建一个action实例,同时也会在内存上划分一块区域,这个区 ...
- Lucene配置步骤详解
Lucene配置步骤说明: 1.搭建环境: 2.创建索引库: 3搜索索引库. Lucene配置步骤: 第一部分:搭建环境(创建环境导入jar包) 前提:已经创建好了数据库(直接导入book.sql文件 ...
- Ubuntu16.04安装Qt5.12.2
第一步:下载文件 https://download.qt.io/official_releases/qt/5.12/5.12.2/ 第二步:安装依赖库 sudo apt-get install bui ...
- 代码托管-gerrit-介绍与环境搭建
什么是gerrit? 转载自 https://blog.csdn.net/tanshizhen119/article/details/79874127 gerrit是谷歌开源的一个git服务端. 主要 ...