eval内置函数

# 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内置函数

# exec应用场景
# 1.执行字符串没有执行结果(没有返回值)
# 2.将执行的字符串中产生的名字形成对应的局部名称空间
# 3.可以操作全局与局部两个名称空间,一般不用关心全局名称空间

source = '''
name = 'Bob'
age = 20
'''
class A:
   pass
a = A()

dic = {}
exec(source, {}, dic)
a.__dict__ = dic   # dic = {‘name': 'Bob', 'age': 20}
print(a.__dict__)
print(a.name)
print(a.age)

元类

# 元类:类的类
# 通过class产生的类,也是对象,而元类就是用来产生该对象的类
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', (), l_d)
print(Student)

type产生类

# 类是type的对象,可以通过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 A(type):
def __init__(cls, class_name, bases, namespace):
print('父类init run')
super().__init__(class_name, bases, namespace) def __call__(cls, *args, **kwargs):
print('父类的call run')
obj = object.__new__(cls)
cls.__init__(obj, *args, **kwargs)
# obj = super().__call__(*args, **kwargs)
return obj def __new__(mcs, *args, **kwargs):
print('父类的new run')
obj = super().__new__(mcs, *args, **kwargs)
return obj class B(metaclass=A):
def __init__(self, name):
print('子类的init run')
self.name = name def __new__(cls, *args, **kwargs):
print('子类的new run')
obj = object.__new__(cls)
return obj a = B('bob')
print(a.__dict__) '''
父类的new run
父类init run
父类的call run
子类的new run
子类的init run
{'name': 'bob'}
'''
 

单例

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

## 单例

```python
#实现单例方法1--类方法及类封装属性
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)

#实现单例方法2--装饰器
```

```python
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))

#实现单例方法3--重用__new__方法
```

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

#实现单例方法4--模块导入(原理:一个模块只有在第一次导入时才会编译执行,之后都是从内存中寻找)
```

```python
# single_module.py
class Single:
   pass
singleton = Single()

# 测试文件
from single_module import singleton
print(singleton)
print(singleton)


#实现单例方法5--自定义元类,并将__call__方法重用
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
   pass


s1 = Songs()
s2 = Songs()
print(s1, s2)

```

eval、exec及元类、单例实现的5种方法的更多相关文章

  1. 29 内置方法 eval | exec 元类 单例

    eval与exec内置方法 将字符串作为执行目标,得到响应结果 eval常用作类型转换:该函数执行完有返回值 exec拥有执行更复杂的字符串:可以形成名称空间 eval内置函数的使用场景:   1.执 ...

  2. swift单例创建的几种方法

    //单例方法1 class SingleTonOne{ static var sharedInstanceOne:SingleTonOne{ struct SingleTonStruct { stat ...

  3. java成神之——ImmutableClass,null检查,字符编码,defaultLogger,可变参数,JavaScriptEngine,2D图,类单例,克隆,修饰符基本操作

    ImmutableClass null检查 字符编码 default logger 函数可变参数 Nashorn JavaScript engine 执行脚本文件 改变js文件输出流 全局变量 2D图 ...

  4. iOS:创建单例对象的两种方式

    单例模式:创建单例对象的两种方式 方式一:iOS4版本之前      static SingleClassManager *singleManager = nil;      +(SingleClas ...

  5. Javascript定义类(class)的三种方法

    将近20年前,Javascript诞生的时候,只是一种简单的网页脚本语言.如果你忘了填写用户名,它就跳出一个警告. 如今,它变得几乎无所不能,从前端到后端,有着各种匪夷所思的用途.程序员用它完成越来越 ...

  6. asp.net.mvc 中form表单提交控制器的2种方法和控制器接收页面提交数据的4种方法

    MVC中表单form是怎样提交? 控制器Controller是怎样接收的? 1..cshtml 页面form提交 (1)普通方式的的提交

  7. Python-元类 单例

    2.元类 用于创建类的类 叫元类 默认元类都是type 主要控制类的创建__init__ 类的实例化__call__ 3.单例 一个类只有一个实例 什么时候用,大家公用一个打印机,没有必要每个人创建新 ...

  8. exec()和元类

    目录 一.exec()的作用 二.元类 2.1什么是元类,元类的作用是什么? 2.2自定义创建元类 一.exec()的作用 exec执行储存在字符串或文件中的 Python 语句,相比于 eval,e ...

  9. 转 java 类 单例

    转 单例概念: java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己自己创建自己的唯一 ...

随机推荐

  1. Linux iptables用法与NAT

    1.相关概念 2.iptables相关用法 3.NAT(DNAT与SNAT) 相关概念 防火墙除了软件及硬件的分类,也可对数据封包的取得方式来分类,可分为代理服务器(Proxy)及封包过滤机制(IP ...

  2. MIP开发教程(二) 使用MIP-CLI工具调试MIP网页

    初始化 MIP 配置 新建一个 MIP 网页 编写 MIP 网页代码 校验 MIP 网页 调试 MIP 网页 1. 初始化 MIP 配置 首先在html目录下进行初始化 MIP 配置: $ mip i ...

  3. springboot~hazelcast缓存中间件

    缓存来了 在dotnet平台有自己的缓存框架,在java springboot里当然了集成了很多,而且缓存的中间件也可以进行多种选择,向redis, hazelcast都是分布式的缓存中间件,今天主要 ...

  4. Selenium的发展历史及原理

    目录 1. selenium1.0的产生 2. webdriver的产生 3. selenium和webdriver的合并 4. selenium3.0的产生 1. selenium1.0的产生 为什 ...

  5. jquery快速入门(二)

    jQuery 效果 1.隐藏,显示 1.1显示 hide() 和隐藏 show() 语法:$(selector).hide(speed,callback); $(selector).show(spee ...

  6. 浅析HttpSession

    苏格拉底曰:我唯一知道的,就是自己一无所知 源头 最近在翻阅Springboot Security板块中的会话管理器过滤器SessionManagementFilter源码的时候,发现其会对单用户的多 ...

  7. python -使用del语句删除对象引用

    使用del语句删除一些对象引用. 注意不是把内存地址删了,你只是删除了引用,它就变为了一个可回收的对象,内存会不定期回收. del语句的语法是: del var1[,var2[,var3[....,v ...

  8. HTTP协议及其相关

    URI.URL.URN URL,统一资源定位符,用来标识某一处资源的地址,必须包含协议和域名,协议指的是HTTP.FTP.WS.file等协议,域名就是常说的网址,比如www.baidu.com ,其 ...

  9. commandArgument用于绑定一个传递的参数

    CommandArgument ='<%#Eval("spid")+","+Eval("piaohao")%>'

  10. oracle学习笔记(六) JDBC使用

    JDBC使用 1. 导包 直接使用IDEA导入依赖包即可 新建一个lib,把jar包放在这里 2. 加载驱动 Class.forName("oracle.jdbc.driver.Oracle ...