python函数修饰符@总结

函数修饰符

Python函数修饰符:”@”。通过decorator装饰器模式,使得代码更简单。

1)函数必须先定义再修饰

2)修饰符”@”后面必须是之前定义的某一个函数

3)每个函数只能有一个修饰符

 

常规修饰符

除去某些特定字符串以外的修饰符,都算作普通修饰符。

经过函数修饰符修饰的函数,在被调用时会调用修饰它的函数。

def test(f):

    print "before ..."

    f()

    print "after ..."

 

@test

def func():

    print "func was called"

 

# 输出如下

# before ...

# func was called

# after ...

# 尽管没有函数被调用,但因为执行了"@test",所以执行顺序应是:

# 1)在编译func之前,执行@test,则会函数test并将func(函数对象)作为参数传入

# 2)在test中调用f()即调用func()

 

def test(func):

    func()

    print "call test"

 

def test1(f):

    f()

    print "call test1"

    

def main():

    @test

    def fun():

        print "call fun"

        @test1

        def fun1():

            print "call fun1"

main()

 

# 输出如下

# call fun

# call fun1

# call test1

# call test

 

@classmethod

用classmethod修饰表示这是一个类方法,无需传入对象参数,但仍需用对象实例调用。如果没有用@classmethod修饰,则表示这是一个对象方法,使用时必须与一个对象绑定。

# 没有修饰,是对象方法

class MyClass():

    def thisIsClassMethod(self):

        print "this is a class method"

 

if __name__ == "__main__":

    c = MyClass()

    MyClass.thisIsClassMethod(c) #调用时传入参数c,否则编译错误

 

# 有修饰则表示该函数为类方法

class MyClass():

    @classmethod

    def thisIsClassMethod(cls,parameter):

        print "this is a class method"

        print cls.__name__

        print type(cls) #打印类型为classobj

 

if __name__ == "__main__":

    MyClass.thisIsClassMethod(None) #不用与对象绑定

    print type(MyClass)

 

@property修饰符

@property:把一个实例方法转为一个(getter)只读实例属性,使得函数可像实例属性一样被’.’访问。使用property修饰的函数效率与原函数几乎一致,property略微快于原函数。

@property只是声明了被修饰函数的getter方法,仅支持’.’访问。

setter方法必须在使用了@property转化为属性后才可以声明setter方法。

setter是将已经有@property转为实例属性后,为其添加写方法。

class Student(object):

 

    #score函数转为属性,可用'.'直接访问,无需()。当然property只是声明scoregetter方法

    @property

    def score(self):

        return self._score

 

    #score函数转为属性赋值,可用'='访问。相当于setter方法

    @score.setter

    def score(self, value):

        self._score = value

 

p = Student()

# 如果没有@property修饰,则p.score()调用

# 如果没有没有property修饰score,则不能定义它的setter方法。

p.score = 100

print p.score

 

@staticmethod修饰符

被staticmethod修饰符的表示这是一个类的静态方法,可以被类直接调用,与@classmethod的区别在于classmethod对应的方法的第一个参数为cls,为类的类型,而staticmethod不是。

 

# 将函数转为类静态方法,被类调用而不是被对象调用

class MyClass:

    @staticmethod

    def thisIsStaticMethod():

        print "This is static method"

 

if __name__ == "__main__":

    MyClass.thisIsStaticMethod()

 

 

  • 10
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
修饰符(decorators)是Python中的一种特殊语法,用于修改函数或类的行为。它们是通过在函数或类定义之前使用@符号,后跟修饰符函数或类的方式来实现的。 修饰符函数接受被修饰的函数作为参数,并返回一个新的函数或修改原始函数。这样,当调用被修饰的函数时,实际上会执行修饰后的函数修饰符主要用于以下几个方面: 1. 扩展函数的功能:可以在不修改原始函数代码的情况下,通过添加修饰符来增加额外的功能。 2. 函数注册:可以使用修饰符函数注册到某个中心,以便在其他地方使用。 3. 访问控制:可以使用修饰符来限制对某些函数或类的访问权限。 下面是一个简单的示例,演示如何使用修饰符来记录函数的执行时间: ```python import time def timeit(func): def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() execution_time = end_time - start_time print(f"函数 {func.__name__} 的执行时间为 {execution_time} 秒") return result return wrapper @timeit def my_function(): # 函数的具体实现 time.sleep(1) my_function() ``` 在上面的例子中,`timeit` 是一个修饰符函数,它接受被修饰的函数作为参数,并返回一个新的函数 `wrapper`。`wrapper` 函数记录了被修饰函数的执行时间,并在执行结束后打印出来。通过在 `my_function` 函数定义之前使用 `@timeit` 修饰符,`my_function` 函数就会被修饰并添加了计时功能。 希望这个例子能帮助你理解修饰符的概念和用法。如果还有其他问题,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值