赞
踩
python除了丰富的第三方库外,本身也提供了一些内在的方法和底层的一些属性,大家比较常用的如dict、list、set、min、max、range、sorted等。笔者最近在做项目框架时涉及到一些不是很常用的方法和属性,在本文中和大家做下分享。
enumerate
, 每一个next返回的是一个tuple单例模式(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
反射在许多框架中都有使用到,简单就是通过类的名称(字符串)来实例化类。一个典型的场景就是通过配置的方式来动态控制类的执行,比如定时任务的执行,通过维护每个定时任务类的执行时间,在执行时间到的时候,通过反射方式实例化类,执行任务,在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
本文通过分享了python内置方法和属性, 并在单例模式和反射中进行应用。希望对你有帮助,欢迎交流@mintel 要点总结如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。