假设有这么一个 class

class Date(object):

    def __init__(self, day=0, month=0, year=0):
self.day = day
self.month = month
self.year = year

现在要把一个字符串 11-09-2012 作为变量,方法一:

string_date = '20-16-2017'
day, month, year = map(int, string_date.split('-'))
date1 = Date(day, month, year)
print date1.day

但是每次初始化一个 classinstance 都要重复操作一次。所以,方法二:

class Date(object):

    def __init__(self, day=0, month=0, year=0):
self.day = day
self.month = month
self.year = year @classmethod
def from_string(cls, date_as_string):
day, month, year = map(int, date_as_string.split('-'))
date1 = cls(day, month, year)
return date1
date2 = Date.from_string('20-06-2017')
print date2.day

staticmethodclassmethod类似,区别在于不接收变量。例如在 class 加入一个判断:

    @staticmethod
def is_date_valid(date_as_string_for_check):
day, month, year = map(int, date_as_string_for_check.split('-'))
return day <= 31 and month <= 12 and year <= 3999
date2 = Date.from_string('20-06-2017')
is_date = Date.is_date_valid('20-06-2017')
print date2.day
print is_date

另外一个使用了 classmethodstaticmethod的例子:

class Employee:
num_of_emps = 0
raise_amount = 1.04 def __init__(self, first, last, pay): self.first = first
self.last = last
self.pay = pay
self.email = first + '.' + last + '@company.com' Employee.num_of_emps += 1 def fullname(self):
return '{} {}'.format(self.first, self.last) def apply_raise(self):
self.pay = int(self.pay * self.raise_amount) @classmethod
def set_raise_amt(cls, amount):
cls.raise_amount = amount @classmethod
def from_string(cls, emp_str):
first, last, pay = emp_str.split('-')
return cls(first, last, pay) @staticmethod
def is_workday(day):
if day.weekday() == 5 or day.weekday() == 6:
return False
return True emp_1 = Employee('Corey', 'Schafer', 50000)
emp_2 = Employee('Test', 'User', 60000) import datetime
my_date = datetime.date(2016, 7, 11) print(Employee.is_workday(my_date))

另外一个例子:

class Letter:
def __init__(self, pattern=None):
self.pattern = pattern def __iter__(self):
yield from self.pattern def __str__(self):
output = []
for blip in self:
if blip == '.':
output.append('dot')
else:
output.append('dash')
return '-'.join(output) @classmethod
def from_string(cls, pattern_string):
# new_input_str = []
pattern_string = pattern_string.split('-')
for i, _ in enumerate(pattern_string):
if _ == 'dot':
pattern_string[i] = '.'
elif _ == 'dash':
pattern_string[i] = '_'
cls = cls(pattern_string)
return cls
# for _ in input_str:
# if _ == 'dot':
# new_input_str.append('.')
# elif _ == 'dash':
# new_input_str.append('_') class S(Letter):
def __init__(self):
pattern = ['.', '.', '.']
super().__init__(pattern)

classmethod和staticmethod的更多相关文章

  1. python基础知识讲解——@classmethod和@staticmethod的作用

    python基础知识讲解——@classmethod和@staticmethod的作用 在类的成员函数中,可以添加@classmethod和@staticmethod修饰符,这两者有一定的差异,简单来 ...

  2. Python中的classmethod与staticmethod

    首先,这是一个经典的问题. 我们首先做一个比较: classmethod的第一个参数是cls,即调用的时候要把类传入 这意味着我们我们可以在classmethod里使用类的属性,而不是类的实例的属性( ...

  3. classmethod 和 staticmethod

    我一般很少用到. Talk is cheap, show you the code. #!/usr/bin/env python # -*- coding: utf-8 -*- ########### ...

  4. 洗礼灵魂,修炼python(47)--巩固篇—定义类的方法之@classmethod,@staticmethod

    定义类的方法,相信你会说,不就是在class语句下使用def () 就是定义类的方法了嘛,是的,这是定义的方法的一种,而且是最普通的方式 首先,我们已经知道有两种方式: 1.普通方法: 1)与类无关的 ...

  5. python基础-abstractmethod、__属性、property、setter、deleter、classmethod、staticmethod

    python基础-abstractmethod.__属性.property.setter.deleter.classmethod.staticmethod

  6. 【python】Python 中的 classmethod 和 staticmethod

    Python 中的 classmethod 和 staticmethod 有什么具体用途? 推荐地址:http://www.cnblogs.com/wangyongsong/p/6750454.htm ...

  7. python classmethod 和 staticmethod的区别

    https://stackoverflow.com/questions/12179271/meaning-of-classmethod-and-staticmethod-for-beginner 1. ...

  8. python的@classmethod和@staticmethod

    本文是对StackOverflow上的一篇高赞回答的不完全翻译,原文链接:meaning-of-classmethod-and-staticmethod-for-beginner Python面向对象 ...

  9. python 封装,隐藏属性,绑定方法classmethod和staticmethod

    [封装] 隐藏对象的属性和实现细节,仅对外提供公共访问方式. [好处] 1. 将变化隔离: 2. 便于使用: 3. 提高复用性: 4. 提高安全性: [封装原则] 1. 将不需要对外提供的内容都隐藏起 ...

  10. Fluent Python: Classmethod vs Staticmethod

    Fluent Python一书9.4节比较了 Classmethod 和 Staticmethod 两个装饰器的区别: 给出的结论是一个非常有用(Classmethod), 一个不太有用(Static ...

随机推荐

  1. 【leetcode】989. Add to Array-Form of Integer

    题目如下: For a non-negative integer X, the array-form of X is an array of its digits in left to right o ...

  2. linux部署jdk-tomcat

    http://blog.csdn.net/u012187452/article/details/72595040 //参考jdk下载 一.安装JDK1 下载安装包http://blog.csdn.ne ...

  3. mpu6050学习

    一.MPU6050初始化 /**************************实现函数******************************************** *函数原型:      ...

  4. SPOJ - VLATTICE (莫比乌斯反演)

    Consider a N*N*N lattice. One corner is at (0,0,0) and the opposite one is at (N,N,N). How many latt ...

  5. IP地址的定义和划分

    IP地址分类:                IP地址根据首首字节开始位可以分为5大类:             分类        首字节开始位         首字节数字范围           ...

  6. delphi 使电脑睡眠代码

    //提升进程令牌函数 function AdjustProcessPrivilege(ProcessHandle:THandle;Token_Name:Pchar):boolean; var Toke ...

  7. [CSP-S模拟测试53]题解

    A.u 只涉及到区间修改可以考虑差分,然而如果每一行都差分复杂度还是过高.我们发现差分标记也是连续的(一行横着的一行斜着的),所以可以维护两个 差分的差分,扫两遍统计即可. #include<c ...

  8. CountDownLatch和CyclicBarrier区别

    CountDownLatch : 一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行. CyclicBarrier : N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待. 倒 ...

  9. 二.通过jenkins对系统的监控(1)

    说明:通过jenkins定时请求系统,判断系统是否挂了. 注:windows环境 1.新建一个自由风格的项目. 2.构建触发器选择定时构建. 3.执行windows批处理命令 4.构建后操作,发邮件 ...

  10. 将已有的lng lat 字段转换成point类型字段

    利用拼接字符串转换point select GeomFromText(CONCAT('POINT(',lng,' ',lat,')')) from community limit 1; 插入字段到新表 ...