类方法、静态方法、装饰器

类方法

类属性:

含义: 类属性就是针对类对象定义的属性

定义类属性: 使用赋值语句在class关键字下方可以定义类属性

作用: 类属性用于记录这个类相关的特征
在这里插入图片描述

类方法:
含义: 类方法是定义在类上的方法,可以通过类或者类的实例来调用;类方法使用@classmethod装饰器进行标识,第一个参数通常命名为cls,表示类本身,而不是类的实例。

使用: 在类方法内部可以直接访问类属性 或者调用其他的类方法

语法:

@classmethod
def 类方法名(cls):
    pass

静态方法

含义: 静态方法不需要访问实例属性或调用实例方法,也不需要访问类属性可以封装成一个静态方法。使用@staticmethod装饰,参数没有self也没有cls

语法:

@classmethod
def 静态方法名():
    pass

使用: 调用静态方法不需要创建对象 直接使用 类名.静态方法名

class Dog(object):
    @staticmethod
    def run():
        print("这是一只二哈")
 
# 通过类名.调用及静态方法->不需要创建对象
Dog.run()

闭包:

形成条件

  • 实现函数嵌套

  • 内部函数使用外部函数的变量

  • 外部函数返回内部函数名字,不要加括号

示例

def test01(a):
    b = 1
    def test02():
        print(a, b)
    return test02

a = test01(6)
a()

#输出
6 1

nonlocal作用对象是外层的变量,就是用在闭包里面

def outer(num1):
    print(num1)
    def inner(num2):
        nonlocal num1
        num1+=num2
        print(num1)
    return inner
d=outer(5)
d(8)

#输出
5
13

装饰器

普通写法

def check(fuc):
    print('检查车辆是否限行')
    def inner():
        print("今天星期一")
        fuc()
    return inner

def what_day():
    print('车限行')

a = check(what_day)
a()

普通装饰器写法

def check(fuc):
    print('检查车辆是否限行')
    def inner():
        print("今天星期一")
        fuc()
    return inner

@check
def what_day():
    print('车限行')

what_day()

装饰器传参

def check(fuc):
    print('检查车辆是否限行')
    def inner(*args):
        print("今天星期一")
        fuc(args)
    return inner

@check
def what_day(name):
    print(f'{name}车限行')


what_day('宝马')

带参数的装饰器

def count_time_args(msg=None):
    def count_time(func):
        def wrapper(*args, **kwargs):
            t1 = time.time()
            func(*args, **kwargs)
            print(f"[{msg}]执行时间为:", time.time() - t1)
        return wrapper

    return count_time

@count_time_args(msg="baiyu")
def fun_one():
    time.sleep(1)

fun_one()

#输出
[baiyu]执行时间为: 1.0043470859527588

内置函数

getattr是python内置的四大函数之一,反射机制,用于获取指定对象的属性或者函数。
语法:

# 获取object对象中的属性name,如果不存在则返回default
def getattr(object, name, default=None): 

示例:

class Test(object):
    x = 1


a = Test()
print(getattr(a, 'x'))  # 获取属性 x 值
print(getattr(a, 'y', 'None'))  # 获取属性 y 值不存在,但设置了默认值
# print(getattr(a, 'y'))    # AttributeError: 'Test' object has no attribute 'y'
print(a.x)  # 效果等同于上面

#输出
1
None
1

获取对象中的函数:如果需要获取的是对象中的属性则直接getattr(a, 'name', 'default')不用加(),需要获取对象中的方法时则getattr(a, 'name', 'default')()


class Demo(object):
    def __init__(self):
        self.name = '张三'
        self.age = '25'

    def first(self):
        print("这是 first 方法")
        return "one"

    def second(self):
        print("这是 second 方法")
        return 123


a = Demo()
# 如果a对象中有属性name则打印self.name的值,否则打印'non-existent'
print(getattr(a, 'name', 'non-existent'))

# 如果a对象中有属性age则打印self.age的值,否则打印'non-existent'
print(getattr(a, 'age', 'non-existent'))

# 如果有方法first,打印其地址,否则打印default
print(getattr(a, 'first', 'default'))

# 如果有方法first,运行函数并打印返回值,否则,打印default,但如果打印的是default加上后面的括号,会变成default(),则会报错
print(getattr(a, 'first', 'default')())

# 如果有方法second,运行函数并打印None否则打印default
print(getattr(a, 'second', 'default')())

#输出
张三
25
<bound method Demo.first of <__main__.Demo object at 0x0000024703338430>>
这是 first 方法
one
这是 second 方法
123
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃鱿鱼的大叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值