类方法
lambda
闭包
类方法
- classmethod
- staticmethod
- instancemethod
类方法
类方法, 通过装饰器 @classmethod 来标明, 可以通过实例对象或类对象直接调用的方法.
- class MyClass(object):
- def __init__(self):
- pass
- def imethod(self):
- pass
- @classmethod
- def cmethod(cls):
- pass
__init__方法是实例方法, 其只在实例化对象的时候才会调用. 而类方法 cmethod() 则是在实例对象时可以调用, 直接用类调用也可以调用.
- m = MyClass() # __init__ 初始化方法调用
- MyClass.cmethod() # 通过类即可调用 类方法
- m.cmethod() # 实例对象也可以调用 类方法
- m.imethod() # 实例方法仅能对象实例对象调用
实例方法
实例方法相比于类方法, 因为其仅能在通过实例对象来调用, 无法直接通过类对象调用, 即不加 @classmethod 和 @staticmethod 的方法
- class Myclass(object):
- def __init__(self):
- pass
- def test1(self):
- pass
- def test2(self):
- pass
上面 demo 中__init__,test1,test2 都是实例方法, 仅能通过实例对象来调用
静态方法
静态方法如同普通的函数, 其调用可以直接通过类, 实例对象来调用, 不可以直接调用, 即直接使用方法名来调用是不可以的.
- # coding: utf-8
- class MyClass(object):
- def __init__(self):
- pass
- @staticmethod
- def smethod1():
- pass
- def test():
- self.smethod1()
- if __name__ == '__main__':
- MyClass.smethod1() # 通过类对象来调用
- m = MyClass()
- m.smethod1() # 通过实例对象来调用
- m.test() # 另一种通过实例对象来调用静态方法
类方法, 实例方法和静态方法的调用区别
类方法: 通过 实例对象和类调用
实例方法: 仅能通过实例对象调用
静态方法: 通过类或实例对象调用, 不可以直接调用
- lambda
- from functools import reduce
- def myadd(x, y):
- return x+y
- mlist = list(map(lambda x: x**2, [i for i in range(20)]))
- flist = list(filter(lambda x: (x%3) == 0, [i for i in range(20)]))
- r = reduce(myadd, [i for i in range(20)])
- # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361]
- print(mlist)
- # [0, 3, 6, 9, 12, 15, 18]
- print(flist)
- # 190
- print(r)
lambda 匿名函数, 其短小精悍, 现写现用, 不用另外编写一个函数. 如上所示
map 返回是一个迭代器, list 负责将生成器转变为列表
filter 返回的是一个生成迭代器, 其将函数里荷合条件的数据拿出来, 换成 map 执行以上代码, 将返回 bool 值
reduce 返回也是一个迭代器, 在这个例子中, 数据在 myadd 不断迭代相加, 得到数值 190.python2 是可以直接使用, python3 其在 functools 中.
闭包
理解: 后面会补充
参考资料
- # coding: utf-8
- def close(mss):
- def hello(name):
- print(mss, name)
- return hello
- h = close("你好!")
- h("小伟")
- h("小小伟")
- """
- 你好! 小伟
- 你好! 小小伟
- """
来源: http://www.bubuko.com/infodetail-2947923.html