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
目录
相关文章
|
6月前
|
Java 数据处理 索引
(Pandas)Python做数据处理必选框架之一!(二):附带案例分析;刨析DataFrame结构和其属性;学会访问具体元素;判断元素是否存在;元素求和、求标准值、方差、去重、删除、排序...
DataFrame结构 每一列都属于Series类型,不同列之间数据类型可以不一样,但同一列的值类型必须一致。 DataFrame拥有一个总的 idx记录列,该列记录了每一行的索引 在DataFrame中,若列之间的元素个数不匹配,且使用Series填充时,在DataFrame里空值会显示为NaN;当列之间元素个数不匹配,并且不使用Series填充,会报错。在指定了index 属性显示情况下,会按照index的位置进行排序,默认是 [0,1,2,3,...] 从0索引开始正序排序行。
447 0
|
7月前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
513 1
|
7月前
|
监控 数据可视化 数据挖掘
Python Rich库使用指南:打造更美观的命令行应用
Rich库是Python的终端美化利器,支持彩色文本、智能表格、动态进度条和语法高亮,大幅提升命令行应用的可视化效果与用户体验。
598 0
|
7月前
|
人工智能 数据安全/隐私保护 异构计算
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
1034 8
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
|
7月前
|
机器学习/深度学习 算法 安全
【强化学习应用(八)】基于Q-learning的无人机物流路径规划研究(Python代码实现)
【强化学习应用(八)】基于Q-learning的无人机物流路径规划研究(Python代码实现)
530 6
|
7月前
|
算法 调度 决策智能
【两阶段鲁棒优化】利用列-约束生成方法求解两阶段鲁棒优化问题(Python代码实现)
【两阶段鲁棒优化】利用列-约束生成方法求解两阶段鲁棒优化问题(Python代码实现)
204 0
|
7月前
|
设计模式 缓存 运维
Python装饰器实战场景解析:从原理到应用的10个经典案例
Python装饰器是函数式编程的精华,通过10个实战场景,从日志记录、权限验证到插件系统,全面解析其应用。掌握装饰器,让代码更优雅、灵活,提升开发效率。
502 0
|
8月前
|
机器学习/深度学习 数据采集 TensorFlow
基于CNN-GRU-Attention混合神经网络的负荷预测方法(Python代码实现)
基于CNN-GRU-Attention混合神经网络的负荷预测方法(Python代码实现)
409 0
|
Python
Python:获取类中除内置方法外的所有方法名
Python:获取类中除内置方法外的所有方法名
254 0
|
7月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
982 102

推荐镜像

更多