zoukankan      html  css  js  c++  java
  • Python的@符号

    Python一直都属于用,没有去系统学习过,在一次代码review中见到了@符号,回来看了下,这个符号用于装饰器中,用于修饰一个函数,把被修饰的函数作为参数传递给装饰器,下面举几个例子:

    1. @classmethod和@staticmethod

    这两个含义很明显,在定义方法的时候@classmethod表示该方法是类方法,类方法必须有一个参数为cls,表示类本身,实例方法的第一个参数是self.@staticmethod修饰的方法基本上和一个全局函数相同。

    这两个修饰的方法通过实例和类调用都是可以的

    class A():
        @classmethod
        def classM(cls):
            print "class method, and invoker:",cls.__name__
        @staticmethod
        def staticM():
            print "static method"
    class B(A):
        pass
    
    A.classM()  #class method, and invoker: A
    B.classM()  #class method, and invoker: B
    A.staticM() #static method
    B.staticM() #static method
    a=A()
    a.classM()  #class method, and invoker: A
    a.staticM() #static method
    b=B()
    b.classM()  #class method, and invoker: B
    b.staticM() #static method
    

     

    2. 作为普通的修饰符,下面的定义类似于 testone=func(testone)

    class C():
        def func(fn):
            def test(*args):
                print "hello"
            return test
        @func
        def testone(a,b):
            print a**2+b**2
        if __name__=="__main__":
            testone(3,4)
    
    
    #output:hello
    
    class C():
        def func(fn):
            def test(*args):
                print "hello"
                fn(*args)
            return test
        @func
        def testone(a,b):
            print a**2+b**2
        if __name__=="__main__":
            testone(3,4)
    
    #output:
    hello
    25
    

    3. 不常见的写法,用来修饰一个class,在单例模式中能用到

    def singleton(cls):
        instance={}
        def getinstance():
            if cls not in instance:
                instance[cls]=cls()
            return instance[cls]
        return getinstance
    
    @singleton
    class Myclass:
        pass
    
    #output
    >>> my1=Myclass()
    >>> print my1
    <__main__.Myclass instance at 0x00000000028C2F48>
    >>> my2=Myclass()
    >>> print my2
    <__main__.Myclass instance at 0x00000000028C2F48>
    

      

      

  • 相关阅读:
    java 的 CopyOnWriteArrayList类
    AtomicInteger类的简单应用
    关于java的关键字 transient
    关于ArrayList的一些源码分析
    Eclipse新建java类的时候,自动创建注释
    关于spring-data-jpa的排序问题
    hibernate CascadeType属性
    springBoot框架不同环境读取不同的配置文件
    你迷茫的原因在于读书太少而想的太多!!!
    学历是铜牌,能力是银牌,人脉是金牌,思维是王牌
  • 原文地址:https://www.cnblogs.com/baibai-tech/p/4035488.html
Copyright © 2011-2022 走看看