eval与exec内置方法

  将字符串作为执行目标,得到响应结果

  eval常用作类型转换:该函数执行完有返回值

  exec拥有执行更复杂的字符串:可以形成名称空间

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

dic_str = "{'a': 1, 'b': 2, 'c': 3}"
print(eval(dic_str)) list_str = "[1, 2, 3, 4, 5]"
print(eval(list_str)) tuple_str = "(1, 2, 3, 4, 5)"
print(eval(tuple_str))

exec应用场景
 1.执行字符串没有执行结果(没有返回值)
 2.将执行的字符串中产生的名字形成对应的局部名称空间

source = '''
name = 'Bob'
age = 20
'''
class A:
pass
a = A() dic = {} # 可以操作全局与局部两个名称空间,一般不用关心全局名称空间
exec(source, {}, dic)
a.__dict__ = dic
print(a.__dict__) # {'name': 'bob', 'age': 20}
print(a.name)
print(a.age)

元类

元类:类的类
  通过class产生的类,也是对象,而元类就是用来产生该对象的类

  类是type的对象,可以通过type(参数)来创建类

local_str = """
def __init__(self, name, age):
self.name = name
self.age = age
def study(self):
print(self.name + '在学习')
"""
local_dic = {}
exec(local_str, {}, local_dic)
Student = type('Student', (), local_dic) # 产生一个Student类
print(Student)

type创建类

# type(name, bases, namespace)

s = '''
my_a = 10
my_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()

自定义元类

  所有自定义的类本身也是对象,是元类的对象,所有自定义的类本质上是由元类实例化出来了

  控制类的产生过程,以及该类对象的产生过程

# 元类:所有自定义的类本身也是对象,是元类的对象,所有自定义的类本质上是由元类实例化出来了
Student = type('Student', (object, ), namespace) class MyMeta(type):
# 在class Student时调用: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()时调用: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 # 问题:
# 1.继承是想获得父级的属性和方法,元类是要将类的创建于对象的创建加以控制
# 2.类的创建由元类的__init__方法控制
# -- 元类(class_name, bases, namespase) => 元类.__init__来完成实例化
# 3.类的对象的创建由元类的__call__方法控制
# -- 对象产生是需要开辟空间,在__call__中用object.__new__()来完成的
class Student(object, metaclass=MyMeta):
pass # class Student: <=> type(class_name, bases, namespace)

  控制类、类的对象 产生过程

class MyMeta(type):
# 控制类的创建过程
def __init__(cls, class_name, bases, namespace):
print(cls, class_name, bases, namespace)
super().__init__(class_name, bases, namespace) def __call__(cls, *args, **kwargs):
obj = object.__new__(cls)
cls.__init__(obj, *args, **kwargs)
return obj # Student类与Student类的对象产生都可以备元类MyMeta控制
class Student(metaclass=MyMeta):
def __init__(self, name, age):
self.name = name
self.age = age
stu = Student('owen', 18)
print(stu.name)

元类的应用

# 单例1
class MyMeta(type):
def __call__(cls, *args, **kwargs):
if not hasattr(cls, 'instance'):
cls.instance = cls.__new__(cls)
cls.instance.__init__(*args, **kwargs)
return cls.instance class A(metaclass=MyMeta):
def __init__(self):
self.ip = '1.1.1.0'

单例

  一个类只能产生一个实例
  为什么要有单例:
    1.该类需要对象的产生
    2.对象一旦产生,在任何位置再实例化对象,只能得到第一次实例化出来的对象
    3.在对象唯一创建后,可以通过属性修改或方法间接修改属性,来完成数据的更新,不能通过实例化方式更新数据

# 单例2
class Song:
__instance = None
def __init__(self):
pass
@classmethod
def getInstance(cls):
if cls.__instance == None:
cls.__instance = cls()
return cls.__instance
s1 = Song.getInstance()
s2 = Song.getInstance()
print(s1, s2)

# 单例3

def singleton(cls):
_instance = None
def getInstance(*args, **kwargs):
nonlocal _instance
if _instance == None:
_instance = cls(*args, **kwargs)
return _instance
return getInstance

@singleton
class A:
def __init__(self, num):
self.num = num print(A(1), A(2), A(3))
print(A(1).num, A(2).num, A(3).num)   # 1 1 1

# 单例4

class A:
__instance = None
def __new__(cls, *args, **kwargs):
if cls.__instance == None:
cls.__instance = super().__new__(cls)
return cls.__instance
print(A(), A())

# 单例5

# single_module.py
class Single:
pass
singleton = Single() # 测试文件
from single_module import singleton
print(singleton)
print(singleton)

29 内置方法 eval | exec 元类 单例的更多相关文章

  1. what's the python之基本运算符及字符串、列表、元祖、集合、字典的内置方法

    计算机可以进行的运算有很多种,运算按种类可分为算数运算.比较运算.逻辑运算.赋值运算.成员运算.身份运算.字符串和列表的算数运算只能用+和*,字典没有顺序,所以不能进行算数运算和比较运算.比较运算中= ...

  2. set dict tuple 内置方法

    今日内容 * 元祖及内置方法* 字典及内置方法* 集合及内置方法* 字符编码 元祖tuple 与列表类似可以存多个值,但是不同的是元祖本身不能被修改 ```python一:基本使用:tuple 1 用 ...

  3. python基础之反射内置方法元类

    补充内置函数 isinstance(obj,Foo)   # 判断obj是不是foo的实例 issubclass()      # 判断一个类是不是另一个类的子类 反射 什么是反射? 通过字符串来操作 ...

  4. day31 反射,内置方法,元类

    目录 一.反射 1 什么是反射 2 如何实现反射 二.内置方法 1 什么是内置方法 2 为什么要用内置方法 3 如何使用内置方法 3.1 str 3.2 del 三.元类 1 什么是元类 2 clas ...

  5. 4月17日 python学习总结 反射、object内置方法、元类

    一.反射 下述四个函数是专门用来操作类与对象属性的,如何操作? 通过字符串来操作类与对象的属性,这种操作称为反射 class People: country="China" def ...

  6. day28 面向对象:反射,内置函数,类的内置方法

    面向对象进阶博客地址链接: http://www.cnblogs.com/Eva-J/articles/7351812.html 复习昨日内容: # 包 # 开发规范 # # hashlib # 登录 ...

  7. 内置函数——eval、exec、compile

    内置函数——eval.exec.compile eval() 将字符串类型的代码执行并返回结果 print(eval('1+2+3+4')) exec()将自字符串类型的代码执行 print(exec ...

  8. python学习之老男孩python全栈第九期_day027知识点总结——反射、类的内置方法

    一. 反射 ''' # isinstance class A:pass class B(A):pass a = A() print(isinstance(a,A)) # 判断对象和类的关系 print ...

  9. day007 列表类型、元祖类型、 字典类型、 集合类型的内置方法

    目录 列表数据类型的内置方法 作用 定义方式 优先掌握的方法 需要掌握的方法 元祖类型的内置方法 作用 定义方式 优先掌握的方法(参考列表方法) 字典类型的内置方法 作用 定义方式 优先掌握的方法 需 ...

随机推荐

  1. 缓存,热点key

    热点Key问题的发现与解决 https://help.aliyun.com/document_detail/67252.html 缓存击穿.失效以及热点key问题 https://www.jiansh ...

  2. CH1201 最大子序和

    http://contest-hunter.org:83/contest/0x10%E3%80%8C%E5%9F%BA%E6%9C%AC%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9 ...

  3. ubuntu下使用ss-qt5

    第一步:.安装ss-qt5 通过PPA源安装,仅支持Ubuntu 14.04或更高版本. 打开终端 sudo add-apt-repository ppa:hzwhuang/ss-qt5 sudo a ...

  4. react native定报预披项目知识点总结

    1.TextInput组件对安卓的适配问题 textInput 在iOS 显示正常,但是在android下会出现下横线,并且字会被遮盖 因此一般都这么用该组件 <TextInput style= ...

  5. Flex布局【弹性布局】学习

    先让我们看看在原来的学习中遇到的问题 之前在软件工程的大作业中,自己从零开始学习如何开发一个网站,从页面,到后台,当然数据库是大二的必修课 在学习如何编写一个静态页面的时候,完全是自学,自己摸索,所以 ...

  6. Mac下查看node等的安装路径

  7. 说说PC站和移动站的移动适配关系优化

    曾经写过关于手机网站的SEO优化方向,但是多数是注重在移动网站代码方面,而把移动和PC的重点关系优化给忽略了,这方面也是很多做SEO优化站长给忽略的一些事情. 2015年11月6日,在百度站长平台可以 ...

  8. django上传图片简单验证以及自动修改图片名称

    django实现文件(图片)上传之后自动修改名称以及页面上传图片时的各种提醒: 1.先在你项目中添加一个文件夹如:system 在文件夹下添加__init__.py 和storage.py文件,并在s ...

  9. Exp1 PC平台逆向破解

    本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShell,会返 ...

  10. jq选择器(jq 与 js 互相转换),jq操作css样式 / 文本内容, jq操作类名,jq操作全局属性,jq获取盒子信息,jq获取位置信息

    jq选择器(jq 与 js 互相转换) // 获取所有的页面元素jq对象 $('css3选择器语法'); var $box = $(".box:nth-child(1)"); 获取 ...