首页 / PYTHON / Python类学习(二)——方法
Python类学习(二)——方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python类学习(二)——方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3305字,纯文字阅读大概需要5分钟。
内容图文
![Python类学习(二)——方法](/upload/InfoBanner/zyjiaocheng/740/9d14109ea5f04212b6e9bd3a89cded51.jpg)
目录
我们一般都是使用对象去调用类中的方法,类中定义的方法我们一般称为实例方法。
今天学习方法进阶知识,可能不是会经常用到,其实我也不知道他们能有什么用;
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
内容总结
以上是互联网集市为您收集整理的Python类学习(二)——方法全部内容,希望文章能够帮你解决Python类学习(二)——方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。