zoukankan      html  css  js  c++  java
  • Python的静态方法和类方法

    Python中使用@staticmethod这个装饰器让方法变为静态方法

    一:定义

    @staticmethod: 首先它是一个装饰器,被装饰的方法不需要隐含的参数,对象和对象的实例都可以调用静态方法

    类方法是通过@classmethod进行装饰,被装饰的方法第一个隐含参数是cls,同样对象和对象的实例都可以调用类方法

    这里还有一个叫实例方法,实例方法就是实例的方法,它是与实例进行绑定的,只能实例进行调用,第一个隐含参数是self

    二:举例说明

    翻译自:https://stackoverflow.com/questions/136097/what-is-the-difference-between-staticmethod-and-classmethod-in-python 高分回答

    @staticmethod与@classmethod的区别:

    class A(object):
        def foo(self,x):
            print "executing foo(%s,%s)"%(self,x)
    
        @classmethod
        def class_foo(cls,x):
            print "executing class_foo(%s,%s)"%(cls,x)
    
        @staticmethod
        def static_foo(x):
            print "executing static_foo(%s)"%x    
    
    a=A()

    1.下面是实例方法调用函数吗,实例a被隐式传递做为第一个参数,即self

    a.foo(1)
    # executing foo(<__main__.A object at 0xb7dbef0c>,1)

    2.当调用类方法时,实例的类就被隐式传递给函数作为第一个参数,即cls

    a.class_foo(1)
    # executing class_foo(<class '__main__.A'>,1)

    你当然也可以使用类调用class.foo,实际上你如果想定义某个函数为类函数,那是因为多半想使用类进行访问而不是实例,A.foo(1)会

    抛出TypeError(实例方法不能类进行调用),但是A.class_foo(1)却可以正常调用

    A.class_foo(1)
    # executing class_foo(<class '__main__.A'>,1)

    还有一个用法:类方法可以被用来创建可继承的动态构造器

    3.在使用staticmethods时,不需要隐含的第一个函数,静态函数的行为除了可以类方法和实例方法进行访问外,和普通方法没有什么区别

    a.static_foo(1)
    # executing static_foo(1)
    
    A.static_foo('hi')
    # executing static_foo(hi)

    foo只是一个函数,但是当你使用a.foo时你并不是获取函数,你获取的是“”第一个参数绑定到实例对象a的部分实现的函数版本“”,foo函数需要连个参数,

    但是a.foo只需要一个参数,a绑定到foo函数,这就是下面这个“bound”的意思

    print(a.foo)
    # <bound method A.foo of <__main__.A object at 0xb7d52f0c>>

    类似的,对于类方法,类绑定到foo函数的

    print(a.class_foo)
    # <bound method type.class_foo of <class '__main__.A'>>

    那么对于静态函数,就没有绑定的对象

    print(a.static_foo)
    # <function static_foo at 0xb7d479cc>

    三:类函数可以用于多态

    class method绑定到类,而且被子类继承,子类调用的时候传入实际调用时的子类型,可以用这个子类型调用其他class method,
    这样就可以在子类型中override某些class method实现多态。static方法一般是不存在override的,它调用的时候没有绑定到具体的参数,所以也不能靠自己实现多态。

    >>> class DictSubclass(dict):
    ...     def __repr__(self):
    ...         return "DictSubclass"
    ... 
    >>> dict.fromkeys("abc")
    {'a': None, 'c': None, 'b': None}
    >>> DictSubclass.fromkeys("abc")
    DictSubclass
    >>> 
  • 相关阅读:
    a 超链接标签
    select(下拉标签和textarea(文本框)
    input标签
    input 标签
    div 标签
    body 标签
    STL__网上资料
    STL_iterator返回值
    STL_算法_中使用的函数对象
    STL_std::iterator
  • 原文地址:https://www.cnblogs.com/BGPYC/p/7608979.html
Copyright © 2011-2022 走看看