Python中的装饰器
- 装饰器模式:所谓的装饰器模式,可以简单地理解为“在不改变原有内部实现的情况下,为函数或者类添加某种特性”。这样我们就可以将一些与业务无关、具有通用性的代码抽象出来,作为装饰器附加到需要这些代码的函数或者类之上。用面向切面编程的思想解释就是“装饰器应该是一个切面”。
- 函数是一等公民:意思就是函数可以被当成普通变量一样使用。在Python中,可以把函数赋值给变量,可以将函数作为其它函数的参数,也可以将函数作为其它函数的返回值
- 闭包:我们都知道局部作用域可以引用全局作用域中的变量,相似的,当一个函数内部又定义了其它函数的时候,内部函数可以使用外部函数所在作用域的变量,这就是闭包。
from functools import wraps
def decorator1(func):
@wraps(func)
def wrapper(*args, **kwargs):
print('Decorator 1')
return func(*args, **kwargs)
return wrapper
def decorator2(func):
@wraps(func)
def wrapper(*args, **kwargs):
print('Decorator 2')
return func(*args, **kwargs)
return wrapper
@decorator1
@decorator2
def add(x, y):
return x + y
- 语法糖:它意指那些没有给计算机语言添加新功能,而只是对人类来说更“甜蜜”的语法,语法糖往往给程序员提供了更实用的编码方式,有益于更好的编码风格,更易读。不过其并没有给语言添加什么新东西
类方法、静态方法和实例方法
- 实例方法隐含的参数为类实例self,而类方法隐含的参数为类本身cls。 静态方法无隐含参数,主要为了类实例也可以直接调用静态方法。所以逻辑上,类方法应当只被类调用,实例方法实例调用,静态方法两者都能调用。主要区别在于参数传递上的区别,实例方法悄悄传递的是self引用作为参数,而类方法悄悄传递的是cls引用作为参数。
class A(object):
def __init__(self, x=0):
self.x = x
#类实例方法 # 最常见的实例方法
def foo(self, y=0):
print self.x, y
#类方法 # cls即为类自身
@classmethod
def class_foo(cls, x=1, y=1):
return cls(x) # 因为类方法可以传参一个cls参数,所以可以调用类的相关信息,而静态方法是一个独立的函数,也是可以调用的,这里为了简单,没有调用静态方法
#静态方法 # 不能传递和类或实例相关的参数,如cls或self,但可以传递其他参数
@staticmethod
def static_foo(x=2):
return A(x)
>>> a = A() # 类实例化
>>> a.x
0
>>> a.foo() # 调用类实例方法,可以使用self.x 取出类实例化的(即初始值)
0 0
>>> b = A.class_foo() # 调用类方法
>>> b.x
1
>>> c = A.static_foo() # 调用类的静态方法
>>> c.x
2
元类
- 元类就是用来创建类的“东西”。元类就是用来创建这些类(对象)的,元类就是类的类。
MyClass = MetaClass() #实际上产生的是类 对象(创建类实例)
MyObject = MyClass()
- 函数type实际上是一个元类。type就是Python在背后用来创建所有类的元类.可以在写一个类的时候为其添加metaclass属性创建元类。
class Foo(object):
__metaclass__ = something
- Python就会用元类来创建类Foo。小心点,这里面有些技巧。你首先写下class Foo(object),但是类对象Foo还没有在内存中创建。Python会在类的定义中寻找metaclass属性,如果找到了,Python就会用它来创建类Foo,如果没有找到,就会用内建的type来创建这个类.
init和new方法
- new方法只负责创建,new至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供,new必须要有返回值,返回实例化出来的实例,这点在自己实现new时要特别注意,可以return父类new出来的实例,或者直接是object的new出来的实例.
- init方法只负责初始化,init_有一个参数self,就是这个new返回的实例,init在new的基础上可以完成一些其它初始化的动作,init不需要返回值.
Python虚拟环境(pyvenv、virtualenv)
Linux下:https://blog.csdn.net/ailib/article/details/74820374
Windows下:https://www.jianshu.com/p/d01a85c8995e