5 函数装饰器
-
为什么要使用函数装饰器?
- 希望在不改变函数代码的前提下,为该函数增加额外的功能,那么就可以使用装饰器来装饰该函数
-
函数装饰器的使用:
- 装饰器是一个函数,装饰器接收一个函数作为参数(传入的实参是被装饰的函数)
- 装饰器内部嵌套定义另外一个函数,内函数中会引用装饰器的参数,并且装饰器的返回值是内函数
- 为了让内函数接收任意类型的参数,将内函数的形参定义为(*args, **kwargs)
- 在函数中,首先完成为被装饰函数添加的新功能,然后调用被装饰的函数
-
装饰器应用到被装饰函数的语法为:
- 在被装饰函数的前面添加“@装饰器的函数名”
>>> def notice(func):
>>> def wrappper(*args,**kwargs):
>>> print('......')
>>> print('公告:')
>>> return func(*args, **kwargs) #返回装饰函数
>>> return wrapper
>>> #应用到被装饰函数
>>> @notice
6 类方法
- 类方法是类对象中**使用装饰器@classmethod**进行装饰的方法
在类对象中定义类方法时,必须用装饰器@classmethod进行装饰
第一形参通常是cls
在类对象中定义类方法的语法:
@classmethod
def 函数名(cls):
- 调用类方法的三种方法:
- 通过类对象调用类方法
MyClass.class_func(‘Hi’,‘everyone!’) - 通过实例对象调用类方法
mc = MyClass()
mc.class_func(1,2) - 在类对象内部调用类方法
cls.class_func(1,2)
- 通过类对象调用类方法
>>> class MyClass(object):
>>> #在类对象中定义类方法
>>> @classmethod
>>> def class_func(cls, a, b):#cls == self
>>> print(a, b)
>>> #在类对象内部调用类方法
>>> cls.class_func(1,2)
>>> #or
>>> MyClass.class_func_1(1,2)
>>> #通过类对象调用类方法
>>> MyClass.class_func('hi','everyone')
>>> #通过实例对象调用类方法
>>> mc = MyClass()
>>> mc.class_func(1,2)
7. 静态方法
类对象的静态方法只是一个普通函数(所以对第一形参没有要求)
在类对象中定义静态方法时,必须用装饰器@staticmethod进行装饰
- 静态方法可以被类对象所调用:
语法格式:
类对象.方法名([实参])/cls.方法名([实参]) - 静态方法可以被实例对象所调用:
语法格式:
实例对象.方法名([实参])/self.([实参])
注:调用静态函数与调用普通函数是一样的
>>> class MyClass(object):
>>> #定义静态方法
>>> @staticmethod
>>> def sm(p1,p2):
>>> print(p1,p2)
>>> #类对象调用静态方法
>>> MyClass.sm(1,2)
>>> #实例对象调用静态方法
>>> mc = MyClass()
>>> mc.sm(1,2)
8. 访问控制
访问控制指:控制类对象的属性和方法在类对象的外部是否可以直接访问
如何设置访问控制:
- 在类对象的某个属性或者方法前面添加两个下划线,那么在类对象的外部就不能 直接访问该属性或者方法了
>>> class MyClass(object):
>>> def __init__(self):
>>> self.__pia = 18
>>> # 设置访问控制
>>> def __pim(self):
>>> print("__pim()被调用了")
>>> mc = MyClass()
>>> print(mc.MyClass__pim())