鱼C论坛

 找回密码
 立即注册
楼主: 小甲鱼

[扩展阅读] Python 函数修饰符(装饰器)的使用

  [复制链接]
发表于 2017-12-6 11:59:17 | 显示全部楼层
零基础入门学习Python封面
《零基础入门学习Python》
(最新版)
小甲鱼 著
立即购买
内置修饰符讲得很泛,不好理解啊。
代码其实可以更加简洁点,而且代码的缩进有问题。 另外def print_hello(cls): 里面的(cls)怎么理解,现在还有点晕晕的。
  1. class Hello:
  2.     @classmethod
  3.     def print_hello(cls):
  4.         print('Hello')
  5. Hello.print_hello()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-17 16:44:50 | 显示全部楼层
看懂了@classmethod,本来类的方法,必须在类实例化对象之后才能调用,现在可以直接通过类来调用,不需要实例化具体的对象,应该是这样的吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-21 09:20:14 | 显示全部楼层
本贴可能有错误,@classmethod语句之前应加一个缩进符
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-24 17:13:28 | 显示全部楼层
不太懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-31 20:24:30 | 显示全部楼层
自从学了编程,感觉智商越来越不够用了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-7 13:55:49 | 显示全部楼层
没看懂,需要把逻辑解释清楚
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-11 23:48:21 | 显示全部楼层
是我智商不够还是没解释清楚,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-11 23:52:18 | 显示全部楼层
前面课程都秒懂的,怎么到这就一点也看不懂啊,小甲鱼,快出来解释清楚点T_T
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-24 17:40:48 | 显示全部楼层
还可以!!!支持小甲鱼!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-5 20:56:01 | 显示全部楼层
读了好几遍才看懂。
结合其他的解说
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-5 23:37:42 | 显示全部楼层
#修饰符的例子,这个比较容易懂
def fun1(f):
    print("fun1的传入参数:", f)

def fun2(f):
    print("fun2的传入参数:", f)
    return 2

def fun3(f):  #第一步执行fun3时,传入的参数是fun5的函数体
    print("fun3的传入参数:", f)
    return 3

@fun1    #第三步 执行fun1, 把返回值付给fun5这个字符串(如果有返回值,没有为None)
@fun2   #第二步 执行fun2,并将其返回值作为参数传入fun1
@fun3   #第一步 把fun5函数体作为参数传入fun3,运行fun3并将其返回值作为参数 传入fun2
def fun5():
    pass

print(fun5) #这里不能像这样fun5()调用了,fun5=fun1(fun2(fun3)), fun5相当于fun1的返回值了,是一个字符串
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-6 10:26:17 | 显示全部楼层
#楼主内置的修饰符那里缩进不对,所以类方法的例子无法运行,下面改了以下,可以运行了

class Hello(object):
    def __init__(self):
         pass

    @classmethod
    def print_hello(cls):
         print("Hello")

Hello.print_hello()
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-12 15:08:22 | 显示全部楼层
看不太懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-14 20:11:19 | 显示全部楼层
如果这里定义了多个类,类方法的这个方法定义是不是让这段代码里面的类都可以用这个方法,那如果要指定的一个类使用怎么办?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-15 17:45:30 | 显示全部楼层
对于@修饰符讲解的不是很清晰。。。例子感觉也有点深度,不怎么适合零基础的学员emmmmmm
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-15 20:18:59 | 显示全部楼层
Python3.7的time.clock已经改成time.perf_counter 和 time.process_time了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-22 11:17:10 | 显示全部楼层
修饰符的作用,看了一些博客以后大概明白了一些
举两个例子:
1.
def fun(f):
    print('I love science')
    f()

@fun
def func():
    print('we love scien
运行结果:
I love science
we love science
在这个例子中,我没有对函数执行调用的操作,也有输出值。

2
def fun1(f):
    print('I love science')
    f()

def fun2(f):
    f()
    print('We love science')


def main():
    @fun1
    def f1():
        print('science!')
        @fun2
        def f2():
            print('wow!')
main()
结果:
I love science
science!
wow!
We love science
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-3-22 16:19:28 | 显示全部楼层
看的我一脸懵逼!
对于一个函数a(),a可以当做一个对象传递到另一个函数中,在上面计算执行时间就可以传递这样一个函数名,timeslong(a)不就可以计算时间了吗?并不需要把a()重写一遍啊....
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-22 16:32:16 | 显示全部楼层
这文章写的...看完真的云里雾里,func()在timeslong()内部根本不用重写,对于外部的函数test(),把test这个对象实参传递给func形参就行了啊。。timeslong(test)不就可以计算test()运行的时间了啊。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-22 16:38:00 | 显示全部楼层
况qiqi 发表于 2018-3-22 11:17
修饰符的作用,看了一些博客以后大概明白了一些
举两个例子:
1.

这样的例子还不错,能够让人理解修饰符这样的语句在程序中是如何执行的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-10-11 05:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表