zoukankan      html  css  js  c++  java
  • python -- @classmethod @staticmethod区别和使用

    python中的定义:

    1. class MyClass:
    2.     ...
    3.     @classmethod  # classmethod的修饰符
    4.     def class_method(cls, arg1, arg2, ...):
    5.         ...
    6.     @staticmethod  # staticmethod的修饰符
    7.     def static_method(arg1, arg2, ...):
    8.         ...

    @classmethod : 类方法

    @staticmethod : 静态方法

    类方法和静态方法的调用一样,都是通过类就可以直接调用。

    区别:类方法,需要传入该类,定义类方法的时候要传一个默认的参数cls。静态方法则不用。

    示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # blog.ithomer.net
     
    class Test(object):
        x = 11
        def __init__(self, _x):
            self._x = _x
            print("Test.__init__")
      
        @classmethod
        def class_method(cls):
            print("class_method")
      
        @staticmethod
        def static_method():
            print("static_method")
      
        @classmethod
        def getPt(cls):
            cls.class_method()
            cls.static_method()
      
    if "__main__" == __name__:
        Test.class_method()         # class_method
        Test.static_method()        # static_method
        Test.getPt()                # class_method  static_method
     
        t = Test(22)                # Test.__init__
        t.class_method()            # class_method
        t.static_method()           # static_method
         
        print Test.x                # 11
    #     print Test._x
         
        print t.x                   # 11
        print t._x                  # 22
         
    #     t.getPr()   # 'Test' object has no attribute 'getPr'

    运行结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class_method
    static_method
    class_method
    static_method
    Test.__init__
    class_method
    static_method
    11
    11
    22
    Traceback (most recent call last):
      File "/home/homer/workspace/myPython/com/connmiliao.py", line 40, in <module>
        t.getPr()
    AttributeError: 'Test' object has no attribute 'getPr'</module>

    示例:@property,@staticmethod,@classmethod 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # blog.ithomer.net
     
    class MyClass(object):
        def __init__(self):
            print '__init__'
            self._name = 'blog.ithomer.net'
     
        @staticmethod
        def static_method():
            print 'This is a static method!'
     
        def test(self):
            print 'call test'
     
        @classmethod
        def class_method(cls):
            print 'cls: ',cls
            print 'cls.name: ',cls.name
            print 'cls.static_method(): ',cls.static_method()
            instance = cls()
            print 'instance.test(): ',instance.test()
     
        @property
        def name(self):
            return self._name
         
        @name.setter
        def name(self, value):
            self._name = value
     
    if __name__ == '__main__':
        MyClass.static_method()
        MyClass.class_method()
         
        mc = MyClass()
        print mc.name
        mc.name = 'forum.ithomer.net' 
        print mc.name

    运行结果:

    This is a static method!
    cls: <class '__main__.myclass'="">
    cls.name: 
    cls.static_method(): This is a static method!
    None
    __init__
    instance.test(): call test
    None
    __init__
    blog.ithomer.net
    forum.ithomer.net

  • 相关阅读:
    redis 持久化
    Hyper-V虚拟机Redhat添加网卡找不到网卡配置文件解决方法
    java 查看ssl log
    iptables配置https防火墙策略
    java 一致性哈希源码 转
    mysql主备配置方法
    hibernate 缓存配置
    Hibernate中文乱码
    HttpPost 中文编码问题 EntityBuilder
    apache 配置tomcat代理
  • 原文地址:https://www.cnblogs.com/sunshine2016/p/5740578.html
Copyright © 2011-2022 走看看