一、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. MySQL性能基准测试对比:5.7 VS 8.0

    本文由云+社区发表 作者:数据库 版权声明:本文由腾讯云数据库产品团队整理,页面原始内容来自于severalnines英文官网,若转载请注明出处.翻译目的在于传递更多全球最新数据库领域相关信息,并不意 ...

  2. Dubbo和Spring Cloud微服务架构'

    微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.虽然微服务架构没有公认的技术标准和规范或者草案,但业 ...

  3. Linux系统上安装MySQL(rpm)

    1.准备工作 从MySQL官网上分别下载mysql服务器端于客户端包. 如: MySQL-server-5.5.15-1.linux2.6.x86_64.rpm和MySQL-client-5.5.15 ...

  4. SpringBoot 动态更新 resources 目录的文件

    一.前言  SpringBoot 打成 Jar 包形式运行后 ,resources 目录下文件的读取修改和原来不太一样,网上比较多的是关于读取的方式,修改的几乎没有,终于在 stackoverflow ...

  5. 介绍Dynamics 365的OrgDBOrgSettings工具

    摘要: 微软动态CRM专家罗勇 ,回复320或者20190320可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 有时候会需要 ...

  6. Apache2配置多域名站点及支持https

    0x00 预备条件 申请SSL证书 建立对应站点目录 开放443端口 0x01 配置sites-available文件 执行 vi /etc/apache2/sites-available/zecoc ...

  7. C# 利用键值对取代Switch...Case语句

    swich....case 条件分支多了之后,会严重的破坏程序的美观性. 比如这个 上述代码是用于两个进程之间通信的代码,由于通信的枚举特别的多,所以case的分支特别的多.导致了代码的可读性,可维护 ...

  8. 可达用户投资额的计算(Java)

    有话要说: 前阵子遇到了一个计算可达用户投资额的问题,觉得非常有趣,故把它记录下来. 问题描述: 某产品可被投资,注册后才可以投资,其注册可以被邀请(并不是每个人都是被邀请的).邀请人可以邀请多个人注 ...

  9. oppo7.0系统手机(亲测有效)激活Xposed框架的流程

    对于喜欢钻研手机的朋友而言,很多时候会使用到xposed框架及种类繁多功能极强的模块,对于5.0以下的系统版本,只要手机能获得root权限,安装和激活xposed框架是异常简单的,但随着系统版本的升级 ...

  10. Exchange 2010邮件服务器的搭建和部署

    Exchange主要是针对内部网或者企业网用户进行搭建的邮件服务器软件,利用它能够很快地搭建安全性较高的内部网邮件系统. 本次搭建在个人环境中实践,纯属爱好折腾,分四步骤,1.搭建windows 20 ...