您的位置:首页 > 编程语言 > Python开发

Python面向对象编程2——装饰器、类方法、静态方法

2019-05-19 00:33 246 查看

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、访问控制

访问控制指:控制类对象的属性和方法在类对象的外部是否可以直接访问

设置访问控制:

在类对象的某个属性或者方法前面添加两个下划线,那么在类对象的外部就不能 直接访问该属性或者方法了

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: