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. 判断JS数据类型的四种方法

    在 ECMAScript 规范中,共定义了 7 种数据类型,分为 基本类型 和 引用类型 两大类,如下所示: 基本类型:String.Number.Boolean.Symbol.Undefined.N ...

  2. python-memcached学习笔记

    介绍: memcached是免费.开源.高性能.分布式内存对象的缓存系统(键/值字典),旨在通过减轻数据库负载加快动态web应用程序的使用. 数据类型:只用一种字符串类型 1:安装 sudo apt- ...

  3. 使用Update Strategy组件无法进行delete操作

    问题: Update Strategy组件根据字段值对目标表进行DD_DELETE操作时失效 同时,session log中报错:Target table [XXXXXXXX] does not al ...

  4. 那些优秀的.NET开发者----汪宇杰:从重视细节,到成就技术专家

    初识汪宇杰 在长沙.NET技术社区筹建过程中,溪源有幸认识来自上海的MVP汪宇杰Edi Wang.在中国众多的微软MVP中,Edi Wang作为一名九零后,也是一位年轻而充满才气的开发者,或许他或许外 ...

  5. 和逛微博、刷朋友圈一样玩转 GitHub

    自打毕业之后,可以说每天打开 Github 或Email 看有没有 watch 项目的消息或者自己项目的 issue,然后在Explore 看看社区内项目的走势,紧接着开始写代码搬砖的工作,偶尔也会关 ...

  6. 【重学计算机】机组D6章:中央处理器

    1. CPU的组成与功能 2. 数据通路 概念:执行部件间传送信息的路径,分共享通路(总线)和专用通路 抽象模型:时钟驱动下,A --> 组合逻辑 --> B D触发器定时模型: 时钟触发 ...

  7. OAuth2实现单点登录SSO

    1.  前言 技术这东西吧,看别人写的好像很简单似的,到自己去写的时候就各种问题,“一看就会,一做就错”.网上关于实现SSO的文章一大堆,但是当你真的照着写的时候就会发现根本不是那么回事儿,简直让人抓 ...

  8. [开发技巧]·Numpy广播机制的深入理解与应用

    [开发技巧]·Numpy广播机制的深入理解与应用 1.问题描述 我们在使用Numpy进行数据的处理时,经常会用到广播机制来简化操作,例如在所有元素都加上一个数,或者在某些纬度上作相同的操作.广播机制很 ...

  9. Python:bs4中 string 属性和 text 属性的区别及背后的原理

    刚开始接触 bs4 的时候,我也很迷茫,觉得 string 属性和 text 属性是一样的,不明白为什么要分成两个属性. html = '<p>hello world</p>' ...

  10. 面向对象之七大基本原则(javaScript)

    1. 前言 2. 单一职责 3. 开闭原则 4. 里氏替换 5. 依赖倒置 6. 接口隔离 7. 迪米特法则 8. 组合聚合复用原则 9. 总结 1. 前言 面向对象编程有自己的特性与原则,如果对于面 ...