Python面向对象编程2——装饰器、类方法、静态方法
1、函数装饰器
装饰器本质上是一个函数,该函数用来处理其他函数,对于某个函数,如果我们希望在不改变该函数代码的前提下,为该函数增加额外的功能,那么就可以使用装饰器来装饰该函数。装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等应用场景。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
# 装饰器函数, 接受函数名作为参数 def decorator(func): def wrapper(): # 提示:wrapper函数中的print()操作只是最简单的示例,根据不同的需求可以换成更有实际意义的操作。 print('good job!') func() # 在包装函数中调用被装饰函数 print('nice!') return wrapper @decorator #此处的效果相当于 job = decorator(job) def job(): print('I am here!')
装饰器接受一个函数作为参数(传入的实参是被装饰的函数),装饰器内部嵌套定义另一个函数,内函数中会引用装饰器的函数,并且装饰器的返回值是内函数。
为了让内函数接受任意类型的参数,将内函数的形参定义为(*args,**kwargs)
在函数中,首先完成为被装饰的函数添加新的功能,然后调用被装饰的函数。
装饰器装饰函数的方法有两种:
方法一: 使用语法糖,在被修饰函数定义前加上 @ + 装饰器的名字
>>> @decorator >>> def func(): >>> pass >>> def notice(func): >>> def wrappper(*args,**kwargs): >>> print('......') >>> print('公告:') >>> return func(*args, **kwargs) #返回装饰函数 >>>> return wrapper >>> @notice #应用到被装饰函数
方法二: 手动将被修饰函数的名字作为参数传入装饰器中
func = decorator(func)
2、实例方法
实例方法指的是只有实例对象才可以调用的方法。
在类对象中定义实例方法时,第一个形参表示调用该方法的实例对象,其对应的实参由系统自动传入。
第一个形参的名称通常是self,也可以是其他名称。
>>> class MyClass(object): 在类对象中定义实例方法 >>> def im1(self,p1,p2): >>> print(p1,p2) >>> def im2(self): #在类对象的内部(其他实例方法中)调用实例方法 >>> self.im1(1,2) >>> mc = MyClass() >>>#在类对象的外部调用实例方法 >>> mc.im1(1,2) #1 2 >>>mc.im2() #1 2
同一个类对象的不同实例对象所绑定的实例方法是相互独立的。给一个实例对象绑定的实例方法,对于另一个实例对象是不起作用的。
为了能让一个类对象的所有实例对象都能调用某个实例方法,可以给类对象绑定该实例方法。
3、类方法
类方法指的是类对象中使用装饰器@classmethod进行装饰的方法。
在类对象中定义类方法时,必须使用装饰器进行装饰,第一个形参表示类对象,第一个形参的名称通常是cls
- 类方法可以被类对象所调用,语法格式为:
类对象.方法名([实参]) 或 cls.方法名([实参])
- 类方法也可以被实例对象所调用,语法格式为:
实例对象.方法名([实参]) 或 self.方法名([实参])
在类对象中定义类方法:
@classmethod def 函数名(cls):
调用类方法的三种方法:
#通过类对象调用类方法 MyClass.class_func(‘Hi’,‘everyone!’) # 通过实例对象调用类方法 mc = MyClass() mc.class_func(1,2) #在类对象内部调用类方法 cls.class_func(1,2)
4、静态方法
类对象的静态方法只是一个普通函数。把某个普通函数归属于类对象,可能只是为了易于代码管理。
在类对象中定义静态方法时,必须使用装饰器@staticmethod进行装饰。
静态方法对第一个形参没有特殊含义和要求。
- 静态方法可以被类对象所调用,语法格式为:
类对象.方法名([实参]) 或 cls.方法名([实参])
- 静态方法也可以被实例参数所调用,语法格式为:
实例参数.方法名([实参]) 或 self.方法名([实参])
调用静态方法是的参数传递与调用普通函数是一样的
>>> class MyClass(object): >>> #定义静态方法 >>> @staticmethod >>> def sm(p1,p2): >>> print(p1,p2) >>> #类对象调用静态方法 >>> MyClass.sm(1,2) >>> #实例对象调用静态方法 >>> mc = MyClass() >>> mc.sm(1,2)
5、访问控制
访问控制指:控制类对象的属性和方法在类对象的外部是否可以直接访问
设置访问控制:
在类对象的某个属性或者方法前面添加两个下划线,那么在类对象的外部就不能 直接访问该属性或者方法了
- Python面向对象编程(3)——类方法、静态方法
- Python 3.x--面向对象编程(二)静态方法、类方法、属性方法
- python面向对象编程(2)—— 实例属性,类属性,类方法,静态方法
- python面向对象编程(2)—— 实例属性,类属性,类方法,静态方法
- Python 进阶_OOP 面向对象编程_静态方法和类方法
- Python第九天 面向对象 类定义 类的属性 类的方法 内部类 垃圾回收机制 类的继承 装饰器
- python类方法 实例方法 静态方法
- Python类的特点 (3) :静态方法与类方法
- python中类方法、实例方法和静态方法
- Python的静态方法和类成员方法
- Python 静态方法和类方法的区别
- python 类方法 静态方法
- python中的静态方法和类方法
- python中的静态方法和类成员方法
- Python中的静态方法与类成员方法区分
- python中,类方法和静态方法区别
- python中的实例方法、静态方法、类方法、类变量和实例变量浅析
- Python——class的基础知识(Python的实例方法,类方法,静态方法之间的区别及调用关系)
- python的静态方法
- Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的