# 单例装饰器 def singleton(cls):
instances = dict() # 初始为空 def _singleton(*args, **kwargs):
if cls not in instances: #如果不存在, 则创建并放入字典 instances[cls] = cls(*args, **kwargs) return instances[cls] return _singleton @singleton class Test(object): pass
if __name__ == '__main__': t1 = Test() t2 = Test()
# 两者具有相同的地址 print t1, t2 staticmethod装饰器
类中两种常用的装饰, 首先区分一下他们:
普通成员函数, 其中第一个隐式参数为对象
classmethod装饰器, 类方法(给人感觉非常类似于OC中的类方法), 其中第一
个隐式参数为类
staticmethod装饰器, 没有任何隐式参数. python中的静态方法类似与C++中的静态方法
#!/usr/bin/env python
# -*- coding: utf-8 -*- class A(object): # 普通成员函数 def foo(self, x):
print \ @classmethod # 使用classmethod进行装饰 def class_foo(cls, x):
print \ @staticmethod # 使用staticmethod进行装饰 def static_foo(x):
print \def test_three_method(): obj = A()
# 直接调用噗通的成员方法
obj.foo(\此处obj对象作为成员函数的隐式参数, 就是self obj.class_foo(\此处类作为隐式参数被传入, 就是cls A.class_foo(\更直接的类方法调用
obj.static_foo(\# 静态方法并没有任何隐式参数, 但是要通过对象或者类进行调用
A.static_foo(\if __name__ == '__main__': test_three_method()
# 函数输出
executing foo(<__main__.A object at 0x100ba4e10>, para) executing class_foo(
property装饰器 定义私有类属性
将property与装饰器结合实现属性私有化(更简单安全的实现get和set方法)。
#python内建函数
property(fget=None, fset=None, fdel=None, doc=None)
fget是获取属性的值的函数,fset是设置属性值的函数,fdel是删除属性的函数,doc是一个字符串(像注释一样)。从实现来看,这些参数都是可选的。
property有三个方法getter(), setter()和delete() 来指定fget, fset和fdel。 这表示以下这行:
class Student(object):
@property #相当于property.getter(score) 或者property(score) def score(self): return self._score
@score.setter #相当于score = property.setter(score) def score(self, value): if not isinstance(value, int):
raise ValueError('score must be an integer!') if value < 0 or value > 100:
raise ValueError('score must between 0 ~ 100!') self._score = value iter魔法
通过yield和__iter__的结合,我们可以把一个对象变成可迭代的 通过__str__的重写, 可以直接通过想要的形式打印对象 #!/usr/bin/env python # -*- coding: utf-8 -*- class TestIter(object): def __init__(self): self.lst = [1, 2, 3, 4, 5]
def read(self):
for ele in xrange(len(self.lst)): yield ele def __iter__(self): return self.read() def __str__(self):
return ','.join(map(str, self.lst))
__repr__ = __str__ def test_iter(): obj = TestIter() for num in obj: print num print obj
if __name__ == '__main__': test_iter() 神奇partial
partial使用上很像C++中仿函数(函数对象)。
在stackoverflow给出了类似与partial的运行方式:
def partial(func, *part_args):