版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
实例方法
- 实例方法指的是只有实例对象才可以调用的方法
- 在类对象中定义实例方法时,第一个形参表示调用该方法的实例对象,其对应的实参由系统自动传入。第一个形参的名称通常是self,也可以是其它名称。
- 实例方法只能被实例对象所调用,有两种调用方式:
- 在类对象的内部: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
函数装饰器
- 对于某个函数,若希望在不改变函数代码的前提下,为该函数增加额外的功能,那么就可以使用装饰器来装饰该函数。
- 装饰器是一个函数,装饰器接受一个函数作为参考(传入的实参是被装饰的函数)。
- 装饰器的内部嵌套定义另一个函数,内函数中会引用装饰器的参数,且装饰器的返回值是内函数。
- 为了让内函数接受任意类型的参数,将内函数的形参定义为
(*args, **kwargs)
- 在函数中首先完成为被装饰函数添加的新功能,然后调用被装饰的函数。
- 把装饰器应用到被装饰函数的语法为:在被装饰函数的前面添加“@装饰的函数名”
-------原函数------------
def add(a, b)
pass
def subt(a, b):
pass
------------加了装饰函数-----------------
# 装饰
def notice():
print("公告")
print("..........")
def add(a, b):
notice()
pass
def subt(a, b):
notice()
pass
---------等价于----------
def add(a, b):
print("公告")
print("..........")
pass
def subt(a, b):
print("公告")
print("..........")
pass
def notice(func):
def wrapper(*args, **kwargs):
print("公告")
print(".........")
return func(*args, **kwargs)
return wrapper
--------------------------------------------------
# 装饰器应用到函数中
@notice
def add(a, b):
return a+b
@notice
def subt(a, b):
return a-b
--------结果--------------
>>>print(add(3, 5))
公告
.............
8
类方法
- 类方法指的是类对象中使用装饰器@classmethod进行装饰的方法。
- 在类对象定义类方法时,必须使用装饰器@classmethod进行装饰,此外,第一个形参表示类对象,其对应的实参由系统自动传入。第一个形参的名称通常是cls,也可以是其它名称。
- 类方法可以被类对象所调用,语法格式为
类对象.方法名([实参])
或cls.方法名([实参])
。 - 类方法也可以被实例对象所调用,语法格式为
实例对象.方法名([实参])
或self.方法名([实参])
。 - 类对象的所有实例对象都有一个指向类对象的指针,所以,类对象的所有实例对象都可以调用类对象中定义的类方法。
- 调用类方法时,系统将自动将类对象作为实参传递给第一个形参。第一个实参会传递给第二个形参,第二个实参会传递给第三个形参,依次类推。
class MyClass(object):
# 在类对象中定义类方法
@classmethod
def class_func(cls, a, b):
print(a, b)
@classmethod
def class_func_1(cls, a, b):
print(a, b)
# 在类对象内部调用类方法
@classmethod
def class_func_2(cls):
MyClass.class_func_1(1, 2)
# or
cls.class_func_1(1, 2)
# 通过实例对象调用类方法
def ins_func(self):
self.class_func_1(1, 2)
----------------------------------------------------------
# 通过类对象调用类方法
>>>MyClass.class_func('Hi' , 'everyone!')
Hi everyone!
# 通过实例对象调用类方法
>>>mc = MyClass()
>>>mc.class_func(1, 2)
1 2
>>>mc = MyClass()
>>>mc.class_func_2()
1 2
1 2
mc.ins_func()
1 2
>>>MyClass.class_func_2()
1 2
1 2
>>>MyClass.ins_func()
TypeError