一、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. Python的线程池

    #!/usr/bin/env python # -*- coding: utf-8 -*- """ concurrent 用于线程池和进程池编程而且更加容易,在Pytho ...

  2. with open为什么会自动关闭文件流

    操作文件我们通常需要手动关闭文件流,可是通过with open()的时候却可以自动关闭,这是为什么呢?其实这就是上下文管理器.我们来看一个例子 #!/usr/bin/env python # -*- ...

  3. Netflix网关zuul(1.x和2.x)全解析

    zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用. Zuul可以通过加载动态过滤机制,从而实现以下各项功能: 验证与安全保障: 识别面向各类 ...

  4. python的小技巧 让你的代码更美观

    持续更新.. 1,活用lambda表达式 匿名函数 lambda 可以提供很多便利.下面是举例. dic = {1:lambda a,b : a+b} 2,代码一行化. 当逻辑语句后只有一行代码的时候 ...

  5. DS控件库 一个简单的血条颜色渐变方案

    Private Sub DS按钮1_ButtonClick(Sender As Object) Handles DS按钮1.ButtonClick Dim T As New Threading.Thr ...

  6. 【译】《C# Tips -- Write Better C#》

    [译]<C# Tips -- Write Better C#> <C# 奇淫巧技 -- 编写更优雅的 C#> 目录 介绍(Introduction) 第一部分:各种奇淫巧技(P ...

  7. 【并发编程】Future模式及JDK中的实现

    1.1.Future模式是什么 先简单举个例子介绍,当我们平时写一个函数,函数里的语句一行行同步执行,如果某一行执行很慢,程序就必须等待,直到执行结束才返回结果:但有时我们可能并不急着需要其中某行的执 ...

  8. Android与js互相调用

    有话要说: 本篇主要总结了简单的Android与js互相调用的方法. 在开发过程中遇到了需要在安卓中调用js方法的需求,于是将具体的实现过程总结成这篇博客. 效果: 其中“调用安卓方法”按钮是html ...

  9. Android应用跳转到微信和支付宝扫一扫

    新版的微信已经把微信功能的schema都禁掉了,意味着我们无法打开微信的扫一扫等功能,目前正常的只能先进入微信(我测试的时候是微信版本7.0.3)已经是很新的版本了 具体调起微信扫一扫代码如下,测试后 ...

  10. 开始食用grpc(之二)

    开始食用grpc(之二) 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9570992.html ``` 前段时间有童鞋找我开专栏.搬家.甚至还有人找我写书的. ...