python内置方法和属性应用:反射和单例

简介: python除了丰富的第三方库外,本身也提供了一些内在的方法和底层的一些属性,大家比较常用的如dict、list、set、min、max、range、sorted等。笔者最近在做项目框架时涉及到一些不是很常用的方法和属性,在本文中和大家做下分享【2月更文挑战第2天】

python内置方法和属性应用:反射和单例

1. 前言

python除了丰富的第三方库外,本身也提供了一些内在的方法和底层的一些属性,大家比较常用的如dict、list、set、min、max、range、sorted等。笔者最近在做项目框架时涉及到一些不是很常用的方法和属性,在本文中和大家做下分享。

2. 内置方法和函数介绍

  • enumerate

    如果你需要遍历可迭代的对象,有需要获取它的序号,可以用enumerate, 每一个next返回的是一个tuple

      list1 = [1, 2, 3, 4]
      list2 = [4, 3, 2, 1]
      for idx, value in enumerate(list1):
          print(idx, value, list2[idx])
      # 0 1 4
      # 1 2 3
      # 2 3 2
      # 3 4 1
    
  • zip
    zip从参数中的多个迭代器取元素组合成一个新的迭代器;
      # 给list加上序号
      b = [4, 3, 2, 1]
      for i in zip(range(len(b)), b):
          print(i)
      # (0, 4)
      # (1, 3)
      # (2, 2)
      # (3, 1)
    
  • globals(): 一个描述当前执行过程中全局符号表的字典,可以看出你执行的所有过程
  • id(object): python对象的唯一标识
  • staticmethod 类静态函数注解

      @staticmethod  
      def test(): 
          print('this is static method')
    
      Foo.test = test
      Foo.test()
    
  • 类的属性
    我们来看下一个类的申明,如下:

      class Foo():
          """this is test class"""
          def __init__(self, name):
              self.name = name
    
          def run(self):
              print('running')
    

    ```python

    列出类的所有成员和属性

    dir(Foo)
    ['class',
    'delattr',
    'dict',
    'dir',
    'doc',
    'eq',
    'format',
    'ge',
    'getattribute',
    'gt',
    'hash',
    'init',
    'init_subclass',
    'le',
    'lt',
    'module',
    'ne',
    'new',
    'reduce',
    'reduce_ex',
    'repr',
    'setattr',
    'sizeof',
    'str',
    'subclasshook',
    'weakref',
    'run']

# 类的注释
Foo.__doc__
# 'this is test class'

# 类自定义属性
Foo.__dict__
mappingproxy({'__module__': '__main__',
          '__doc__': 'this is test class',
          '__init__': <function __main__.Foo.__init__(self, name)>,
          'run': <function __main__.Foo.run(self)>,
          '__dict__': <attribute '__dict__' of 'Foo' objects>,
          '__weakref__': <attribute '__weakref__' of 'Foo' objects>})

# 类的父类
Foo.__base__

# 类的名字
Foo.__name__

```
**类的实例化和初始化**
```python
# python类先通过__new__实例化,再调用__init__进行初始化类成员
foo = Foo('milk')
```

**类的属性添加和访问**
```python
# 类的访问
foo.name
foo.run()

# 可以通过setattr 动态的添加属性
def method():
    print("cow")

setattr(foo, "type", "cow")
setattr(foo, "getcow", method)
# cow
foo.type
foo.getcow()

# 动态删除属性 delattr
delattr(foo, "type")

# getattr 获取成员属性
if hasattr(foo, "run"): # 判断是否有属性
    func = getattr(foo, "run")
    func()

```

3. 单例模式应用

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。单例模式要求在类的使用过程中只实例化一次,所有对象都共享一个实例。创建的方法是在实例的时候判断下是否已经实例过了,有则返回实例化过的全局实例。python是如何实现的呢?关键是找到实例化的地方,对就是前面说的__new__

class Singleton(object):
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            cls._instance = object.__new__(cls)
        return cls._instance

    def __init__(self, name):
        self.name = name


a = Singleton('name1')
b = Singleton('name2')
print(id(a), id(b))
print(a.name, b.name)
# 1689352213112 1689352213112
# name2 name2

4. 反射应用

反射在许多框架中都有使用到,简单就是通过类的名称(字符串)来实例化类。一个典型的场景就是通过配置的方式来动态控制类的执行,比如定时任务的执行,通过维护每个定时任务类的执行时间,在执行时间到的时候,通过反射方式实例化类,执行任务,在java中也非常的常见。

python的实现可以通过上面说的getattr获取模块中的类, 通过methodcaller来调用方法。我们来看一个简单的例子

import importlib
from operator import methodcaller

class Foo():
    """this is test class"""
    def __init__(self, name):
        self.name = name

    def run(self, info):
        print('running %s' % info)

# 类所在的模块,默认情况__main__, 可以通过Foo.__dict__ 中'__module__'获取
api_module = importlib.import_module('__main__') 
# getattr获取模块中的类, 这里Foo是字符串哦
clazz = getattr(api_module, 'Foo')

# 实例化
params = ["milk"]
instance = clazz(*params)

# 方法调用, 方法也是字符串methodcaller(方法名, 方法参数)
task_result = methodcaller("run", "reflection")(instance)

# running reflection

5. 总结

本文通过分享了python内置方法和属性, 并在单例模式和反射中进行应用。希望对你有帮助,欢迎交流@mintel
要点总结如下:

  • dir下类
  • 查看类自定义属性dict
  • new实例化类,init初始化类
  • getattr 获取属性
  • setattr 设置属性
  • 记住importlib和methodcaller
目录
相关文章
|
5天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
17天前
|
人工智能 安全 Java
Java和Python在企业中的应用情况
Java和Python在企业中的应用情况
44 7
|
15天前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
33 3
|
27天前
|
数据库 Python
Python 应用
Python 应用。
39 4
|
10天前
|
JSON 安全 API
Python调用API接口的方法
Python调用API接口的方法
47 5
|
8天前
|
缓存 开发者 Python
深入探索Python中的装饰器:原理、应用与最佳实践####
本文作为技术性深度解析文章,旨在揭开Python装饰器背后的神秘面纱,通过剖析其工作原理、多样化的应用场景及实践中的最佳策略,为中高级Python开发者提供一份详尽的指南。不同于常规摘要的概括性介绍,本文摘要将直接以一段精炼的代码示例开篇,随后简要阐述文章的核心价值与读者预期收获,引领读者快速进入装饰器的世界。 ```python # 示例:一个简单的日志记录装饰器 def log_decorator(func): def wrapper(*args, **kwargs): print(f"Calling {func.__name__} with args: {a
24 2
|
15天前
|
机器学习/深度学习 自然语言处理 语音技术
Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧
本文介绍了Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧,并通过TensorFlow和PyTorch等库展示了实现神经网络的具体示例,涵盖图像识别、语音识别等多个应用场景。
39 8
|
16天前
|
机器人 计算机视觉 Python
Python作为一种高效、易读且功能强大的编程语言,在教育领域的应用日益广泛
Python作为一种高效、易读且功能强大的编程语言,在教育领域的应用日益广泛
33 5
|
26天前
|
机器学习/深度学习 数据采集 数据可视化
Python在数据科学中的应用:从入门到实践
本文旨在为读者提供一个Python在数据科学领域应用的全面概览。我们将从Python的基础语法开始,逐步深入到数据处理、分析和可视化的高级技术。文章不仅涵盖了Python中常用的数据科学库,如NumPy、Pandas和Matplotlib,还探讨了机器学习库Scikit-learn的使用。通过实际案例分析,本文将展示如何利用Python进行数据清洗、特征工程、模型训练和结果评估。此外,我们还将探讨Python在大数据处理中的应用,以及如何通过集成学习和深度学习技术来提升数据分析的准确性和效率。
|
28天前
|
机器学习/深度学习 JSON API
Python编程实战:构建一个简单的天气预报应用
Python编程实战:构建一个简单的天气预报应用
42 1