Python类学习(二)——方法

目录

1. 类也可以调用实例方法

2.  类方法和静态方法

3. @函数装饰器

补充:作用


我们一般都是使用对象去调用类中的方法,类中定义的方法我们一般称为实例方法

今天学习方法进阶知识,可能不是会经常用到,其实我也不知道他们能有什么用;

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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值