假设有这么一个 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. const char *转化为char *的方法

    直接将const char *赋值给char *是错误的,编译器不允许这种操作. #include "stdio.h" #include "string.h" ...

  2. Bootstrap 小功能

    <div class="container"> <div class="navbar-header"> <button type= ...

  3. 【串线篇】SpringMvc视图解析

    一. 请求处理方法执行完成后,最终返回一个 ModelAndView 对象.对于那些返回 String,View 或 ModeMap 等类型的处理方法,Spring MVC 也会在内部将它们装配成一个 ...

  4. 阿里云ssh免密登陆突然无效

    [root@node03 ~]# ssh-copy-id node02 root@node02's password: sh: .ssh/authorized_keys: Permission den ...

  5. 【leetcode】982. Triples with Bitwise AND Equal To Zero

    题目如下: Given an array of integers A, find the number of triples of indices (i, j, k) such that: 0 < ...

  6. Halo(五)

    ApplicationPreparedEvent 监听事件 Event published once the application context has been refreshed but be ...

  7. OC学习篇之---对象的拷贝

    在前一篇文章中我们说到了如何解决对象的循环引用问题:http://blog.csdn.net/jiangwei0910410003/article/details/41926369,这一篇文章我们就来 ...

  8. 工程师技术(六):Linux工程师 综合测试

    一.Linux工程师 综合测试 目标: 根据本文提供的练习步骤完成所有练习案例. 方案: 开始练习之前,先依次重置虚拟机环境. [root@room9pc13 ~]# rht-vmctl  reset ...

  9. GIT上传下载报错:[You do not have permission to pull from the repository]的解决方案!

    第一步:打开我的电脑 第二步:选择此电脑,右击弹出框点击属性进入控制面板 第三步:进入控制面板 第四步:搜索管理凭据 第五步:编点击右侧按钮,进行编辑用户名和密码的操作添加凭据 git:https:/ ...

  10. JavaWeb解决中文乱码

    1.Get请求,方案有两种 A:修改Tomcat配置文件 server.xml   URIEncoding="UTF-8" 如:<Connector port="8 ...