美文网首页
staticmethod 和 classmethod

staticmethod 和 classmethod

作者: 037251a7c483 | 来源:发表于2017-08-22 11:59 被阅读146次

    Python 类有3种方法,分别是实例方法、类方法、静态方法。

    • 实例方法: 实例方法是见的最多的一种。第一个参数为self,即实例本身。

    • classmethod : 调用 类方法时,第一个参数是类,而不是该类的实例(和我们通常使用的实例方法不一样)。也就是说,我们在类里面可以使用这个类和他的属性而不是通过实例化后来使用这个类和访问类属性。

    • staticmethod: 当调用这个函数时,我们不把类的实例传给他(就和使用普通函数一样)。也就是说,我们在类内部放入 静态方法,不能通过实例访问这个类,只能通过类访问(当我们的方法不使用实例时,这个是很有用的)

    简单来讲,实例方法的第一个参数为self,即实例本身; 类方法的第一个参数为cls,即类本身; 静态方法不需要参数,就和普通方法一样的。 实例可以调用这三种方法,但是类只能调用类方法和静态方法。

    #!/usr/bin/env python
    # coding: utf-8
    
    class Method(object):
        value = 999
    
        def __init__(self, data):
            self.data = data
    
        def instance_method(self):
            print self.data
    
        @staticmethod
        def static_method():
            print "This is static method."
    
        @classmethod
        def class_method(cls):
            print cls.value
    
    In [14]: method = Method(2)
    
    In [15]: method.instance_method()
    2
    
    In [16]: method.static_method()
    This is static method.
    
    In [17]: method.class_method()
    999
    
    In [18]: Method.instance_method()
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    <ipython-input-18-41e7d5a9acb2> in <module>()
    ----> 1 Method.instance_method()
    
    TypeError: unbound method instance_method() must be called with Method instance as first argument (got nothing instead)
    
    In [19]: Method.static_method()
    This is static method.
    
    In [20]: Method.class_method()
    999
    
    

    实例二(使用上的区别)

    • 如果在 staticmethod 中访问类的方法或者属性,只能是 类名.方法名 或者** 类名.属性名** 的方式访问

    • 如果在 classmethod 中访问类的方法或者属性, 因为持有cls 参数,可以直接使用cls 参数来访问 类的方法、属性。形如 cls.<attribute>, cls.<method>

    示例

    In [63]: class MyClass(object):
        ...:     value = 12
        ...:     def act(self):
        ...:         print 'This is a test.'
        ...:     @staticmethod
        ...:     def smeth():
        ...:         print 'This is a static method.'
        ...:         print MyClass.value
        ...:         print MyClass.act
        ...:         
        ...:     @classmethod
        ...:     def cmeth(cls):
        ...:         print 'This is a class method of ', cls
        ...:         print cls.value
        ...:         print cls.act
        ...:         
        ...:         
    
    In [64]: MyClass.smeth()
    This is a static method.
    12
    <unbound method MyClass.act>
    
    In [65]: MyClass.cmeth()
    This is a class method of  <class '__main__.MyClass'>
    12
    <unbound method MyClass.act>
    
    In [66]: my = MyClass()
    
    In [67]: my.cmeth()
    This is a class method of  <class '__main__.MyClass'>
    12
    <unbound method MyClass.act>
    
    In [68]: my.smeth()
    This is a static method.
    12
    <unbound method MyClass.act>
    
    

    相关文章

      网友评论

          本文标题:staticmethod 和 classmethod

          本文链接:https://www.haomeiwen.com/subject/mpnvkxtx.html