目录
我们一般都是使用对象去调用类中的方法,类中定义的方法我们一般称为实例方法。
今天学习方法进阶知识,可能不是会经常用到,其实我也不知道他们能有什么用;
class Dog:
def __init__(self, sex="公", classification="二哈"):
# 为Dog对象定义了三个实例变量
self.sex = sex
self.classification = classification
self.health = 1
def is_dog_healthy(self):
if self.health == 1:
return True
else:
return False
def feed_food(self, type):
if self.is_dog_healthy()==False:
print("狗狗得病了需要吃好的")
elif type == "breakfast":
print("1号类型狗粮")
elif type == "lunch":
print("2号类型狗粮")
else:
print("3号类型狗粮")
1. 类也可以调用实例方法
首先仿照对象调用类中的方法:
Dog.is_dog_healthy()
# TypeError: is_dog_healthy() missing 1 required positional argument: 'self'
程序报错,调用方法时"self"参数没有赋值,这说明类调用方法时参数self并不会自动指向调用者。
如果希望使用类调用实例方法,必须手动为方法的第一个参数self传入参数值:
1)将对象传给参数self;
my_dog_1 = Dog()
print(Dog.is_dog_healthy(my_dog_1))
# True
此时等同于对象调用该方法;
2)视情况传入其他参数值;
2. 类方法和静态方法
类方法和静态方法很相似,推荐使用类来调用(当然对象也可以调用);
类方法和静态方法的区别:类方法的第一个参数cls会自动指定为类本身,静态方法不会;
使用@classmethod修饰的方法就是类方法,使用@staticmethod修饰的方法就是静态方法;
class Bird:
# 类方法
@classmethod
def fly(cls):
print("类方法fly:", cls)
# 静态方法
@staticmethod
def describe(p):
print("静态方法:", p)
# 类调用类方法和静态方法
Bird.fly() # 类方法fly: <class '__main__.Bird'>
Bird.describe("不知道做什么用") # 静态方法: 不知道做什么用
my_bird = Bird()
# 对象调用类方法和静态方法
my_bird.fly() # 类方法fly: <class '__main__.Bird'>
my_bird.describe("不知道做什么用") # 静态方法: 不知道做什么用
使用类还是对象调用类方法,类方法第一个参数cls都被指定为类本身,所以使用对象调用类方法和类调用类方法没有区别;
使用类还是对象调用静态方法,Python都不会为第一个参数自定指定参数值;
类方法和静态方法作用:Python编程不需要,其他不知道;
3. @函数装饰器
@classmethod和@staticmethod都是函数装饰器,其中classmethod和staticmethod都是函数;
“@已有的函数” 表示用这个函数修饰其他的函数;
比如@A,用函数A去修饰函数B,其实际完成了两步操作;
1)将被修饰的函数B作为参数传给函数A,A(B);
2)将函数B替换成第一步A(B)的返回值;
注:被修饰的函数B变成什么完全由 A(B)返回值决定,或是一个整型,或是一个字符串,还可以是一个函数等;
def funA(p):
p()
print("我是函数A")
return "我是怎样运作的"
@funA
def funB():
print("我是函数B")
print(funB)
# 我是函数B
# 我是函数A
# 我是怎样运作的
上面程序是怎么运行的:
1)第一步,将funB函数传给funA函数参数:funA(funB);
@funA 相当于执行函数funA(funB);
2)第二步,将funA(funB)的返回值“我是怎么运作的”替换函数funB函数;因此funB函数现在成了一个字符串;
补充:作用
既可以在被修饰函数的前面添加一些额外的处理逻辑(如权限检查);
也可以在被修饰函数的后面添加一些额外的处理逻辑(如记录日志);
还可以在目标方法抛出异常时进行一些修复操作;
.........
这种改变不需要修改被修饰函数的代码,只是增加一个修饰而已;
# 通过函数修饰器为函数添加权限检查
def auth(fn):
def auth_fn(*args):
print("模拟权限检查")
fn(*args)
# 返回一个函数
return auth_fn
@auth
def test(a, b):
print("执行test函数,参数a:%s,参数b:%s"%(a, b))
test(10, 5)
# 模拟权限检查
# 执行test函数,参数a:10,参数b:5