博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
classmethod和staticmethod
阅读量:5312 次
发布时间:2019-06-14

本文共 3107 字,大约阅读时间需要 10 分钟。

假设有这么一个 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 date1date2 = 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.dayprint 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 Trueemp_1 = Employee('Corey', 'Schafer', 50000)emp_2 = Employee('Test', 'User', 60000)import datetimemy_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)

转载于:https://www.cnblogs.com/yaos/p/7056022.html

你可能感兴趣的文章
ajax连接服务器框架
查看>>
wpf样式绑定 行为绑定 事件关联 路由事件实例
查看>>
利用maven管理项目之POM文件配置
查看>>
TCL:表格(xls)中写入数据
查看>>
Oracle事务
查看>>
String类中的equals方法总结(转载)
查看>>
属性动画
查看>>
标识符
查看>>
给大家分享一张CSS选择器优选级图谱 !
查看>>
Win7中不能调试windows service
查看>>
通过httplib2 探索的学习的最佳方式
查看>>
快来熟练使用 Mac 编程
查看>>
Node.js 入门:Express + Mongoose 基础使用
查看>>
一步步教你轻松学奇异值分解SVD降维算法
查看>>
使用pager进行分页
查看>>
UVA - 1592 Database
查看>>
Fine Uploader文件上传组件
查看>>
javascript中的传递参数
查看>>
objective-c overview(二)
查看>>
python查询mangodb
查看>>