http://blog.csdn.net/pipisorry/article/details/49516185

面相对象程序设计中,类方法和静态方法是经常用到的两个术语。
逻辑上讲:类方法是只能由类名调用;静态方法可以由类名或对象名进行调用。
在C++中,静态方法与类方法逻辑上是等价的,只有一个概念,不会混淆。
在python中,方法分为三类实例方法、类方法、静态方法。

@classmethod和@staticmethod

他们的使用场景并不一样。在python中,两种方法的主要区别在于参数

  • 类内部普通的方法,都是以self作为第一个参数,代表着通过实例调用时,将实例的作用域传入方法内;
  • @classmethodcls作为第一个参数,代表将类本身的作用域传入。无论通过类来调用,还是通过类的实例调用,默认传入的第一个参数都将是类本身
  • @staticmethod不需要传入默认参数,类似于一个普通的函数

实例方法隐含的参数为类实例self;
类方法隐含的参数为类本身cls;
静态方法无隐含参数,主要为了类实例也可以直接调用静态方法。

逻辑上类方法应当只被类调用,实例方法实例调用,静态方法两者都能调用。

而实际上,python实现了一定的灵活性使得类方法和静态方法都能够被实例和类二者调用。

皮皮blog

示例

示例1

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
__title__ = 'python实例方法,类方法和静态方法区别及使用'
__author__ = '皮'
__email__ = 'pipisorry@126.com'
# code is far away from bugs with the god animal protecting
    I love animals. They taste delicious.
"""
import traceback

class T:
    def InstanceMethod(self):
        print("instance Method!")
        print(self)

    @classmethod
    def ClassMethod(cls):
        # def ClassMethod(self):#当然这样也不会出错
        print("class Method")
        print(cls)

    @staticmethod
    def StaticMethod():
        print("static method")

t = T()

t.InstanceMethod()
t.ClassMethod()
t.StaticMethod()

T.ClassMethod()
T.StaticMethod()

T.InstanceMethod(t)

# 错误的情况
try:
    t.ClassMethod(T)
    T.InstanceMethod()
except:
    print(traceback.format_exc())

示例2

假设我们需要创建一个名为Date的类,用于储存 年/月/日 三个数据
class Date(object):
    def __init__(self, year=0, month=0, day=0):
        self.year = year
        self.month = month
        self.day = day
    
    @property
    def time(self):
        return "{year}-{month}-{day}".format(
            year=self.year,
            month=self.month,
            day=self.day
        )
上述代码创建了Date类,该类会在初始化时设置day/month/year属性,并且通过property设置了一个getter,可以在实例化之后,通过time获取存储的时间:
date = Date('2016', '11', '09')
date.time # 2016-11-09
但如果我们想改变属性传入的方式呢?毕竟,在初始化时就要传入年/月/日三个属性还是很烦人的。能否找到一个方法,在不改变现有接口和方法的情况下,可以通过传入2016-11-09这样的字符串来创建一个Date实例?
你可能会想到这样的方法:
date_string = '2016-11-09'
year, month, day = map(str, date_string.split('-'))
date = Date(year, month, day)
但不够好:
    在类外额外多写了一个方法,每次还得格式化以后获取参数
    这个方法也只跟Date类有关
    没有解决传入参数过多的问题
此时就可以利用@classmethod,在类的内部新建一个格式化字符串,并返回类的实例的方法:
# 在 Date 内新增一个 classmethod
@classmethod
def from_string(cls, string):
    year, month, day = map(str, string.split('-'))
    # 在 classmethod 内可以通过 cls 来调用到类的方法,甚至创建实例
    date = cls(year, month, day)
    return date
这样,我们就可以通过Date类来调用from_string方法创建实例,并且不侵略、修改旧的实例化方式:
date = Date.from_string('2016-11-09')
# 旧的实例化方式仍可以使用
date_old = Date('2016', '11', '09')
好处:
    在@classmethod内,可以通过cls参数,获取到跟外部调用类时一样的便利
    可以在其中进一步封装该方法,提高复用性
    更加符合面向对象的编程方式
而@staticmethod,因为其本身类似于普通的函数,所以可以把和这个类相关的 helper 方法作为@staticmethod,放在类里,然后直接通过类来调用这个方法。
# 在 Date 内新增一个 staticmethod
@staticmethod
def is_month_validate(month):
    return int(month) <= 12 and int(month) >= 1
将与日期相关的辅助类函数作为@staticmethod方法放在Date类内后,可以通过类来调用这些方法:
month = '08'
if not Date.is_month_validate(month):
    print('{} is a validate month number'.format(month))

from:http://blog.csdn.net/pipisorry/article/details/49516185

ref: [Static Methods and Class Methods]*

python类:class

[Python @classmethod and @staticmethod for beginner]

[Difference between staticmethod and classmethod in python]

python类:类方法和静态方法的更多相关文章

  1. 第7.17节 Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析

    第7.17节  Python类中的静态方法装饰器staticmethod 定义的静态方法深入剖析 静态方法也是通过类定义的一种方法,一般将不需要访问类属性但是类需要具有的一些能力可以静态方法提供. 一 ...

  2. python类的实例方法\静态方法\类方法区别解析(附代码)

    前言 搞了好久python,一直搞得不太清楚这几种类的方法,今天花时间好好测试一下,算是弄懂点皮毛吧. 三种方法的不同 先剽窃个图看一下 可以看到,实例是三种方法都可以调用的,而类只可以调用两种.所以 ...

  3. python 浅析类方法与静态方法

    类方法,静态方法的定义 Python 是双面向的,既可以面向函数编程,也可以面向对象编程,所谓面向函数就是单独一个. py 文件,里面没有类,全是一些函数,调用的时候导入模块,通过模块名.函数名()即 ...

  4. python 用类方法和静态方法实现是追加写文件内容,和读指定行号的内容

    用类方法和静态方法实现:一个是追加写文件一行内容,一个是读指定行号的内容   #coding=utf-8   class handle_file(object):     def __init__(s ...

  5. python 类属性、静态方法与类方法

    1. 类属性 1.1 定义 在类中方法外通过属性名 = 属性值定义的属性 访问方式: 类名.属性名 对象名.属性名 class Student: cls_id = 102 stu = Student( ...

  6. python 面向对象 类方法,静态方法,property

    property 内置装饰器函数 只在面向对象使用 把方法当初属性使用(方法不加参数) 例子: class Rectangle: def __init__(self,long,wide,color): ...

  7. python 类高级语法 静态方法

    通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方 ...

  8. python面向对象学习(六)类属性、类方法、静态方法

    目录 1. 类的结构 1.1 术语 -- 实例 1.2 类是一个特殊的对象 2. 类属性和实例属性 2.1 概念和使用 2.2 属性的获取机制 3. 类方法和静态方法 3.1 类方法 3.2 静态方法 ...

  9. python类属性和类方法(类的结构、实例属性、静态方法)

    类属性和类方法 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 —— 实例 使用面相对象开发,第 1 步 是设计 类 使用 类名() 创建对象,创建对象 的动作有两 ...

随机推荐

  1. react 踩的坑

    1.如上图所示:没有任何语法错误,可是只要加上</button>闭合标签后就乱套了 解决方案:sublimetext view-syntax-babel-javascript(babel) ...

  2. JNI 方法注册与签名+BufferedReader使用readLine问题

    最近了解了关于JavaJNI接口的一些关于方法注册与签名相关的知识,在此进行一下总结. 使用JNI接口时,我们首先需要把Java方法声明为native: public native void f(); ...

  3. day0203 XML 学习笔记

    day02, 03 1. xml语言和作用 2. xml语法详解 2.1 xml 语法声明 2.1.1 encoding 属性 2.1.2 standalone 属性 2.2 xml 元素(Eleme ...

  4. java利用自定义类型对树形数据类型进行排序

    前言 为什么集合在存自定义类型时需要重写equals和hashCode? 1.先说List集合 List集合在存数据时是可以重复的但是 当我们需要判断一个对象是否在集合中存在时这样就有问题了! 因为我 ...

  5. ACM Self Number

    In 1949 the Indian mathematician D.R. Kaprekar discovered a class of numbers called self-numbers. Fo ...

  6. 存出和载入Docker镜像

    存出镜像 如果要导出镜像到本地文件,可以使用 docker save 命令. $ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL ...

  7. Python 元组内置函数

    Python元组包含了以下内置函数 序号 方法及描述 1 cmp(tuple1, tuple2)比较两个元组元素. 2 len(tuple)计算元组元素个数. 3 max(tuple)返回元组中元素最 ...

  8. Template基础

    模板系统的介绍 你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. def current_datetime(request): now ...

  9. Bootstrap3 表单-被支持的控件:输入框

    输入框包括大部分表单控件.文本输入域控件,还支持所有 HTML5 类型的输入控件: text.password.datetime.datetime-local.date.month.time.week ...

  10. Android自定义异常类

    当一个项目中,异常可能出现地方非常多的时候就需要考虑封装处理异常信息.本篇博客就对自定义异常做一个封装,模拟实际开发中的异常处理. 新建一个基类异常HException: public class H ...