最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

对于初学者如何理解@classmethod和@staticmethod

来源:动视网 责编:小采 时间:2020-11-27 14:09:36
文档

对于初学者如何理解@classmethod和@staticmethod

对于初学者如何理解@classmethod和@staticmethod:staticmethod相当于一个定义在类里面的函数,所以如果一个方法既不跟实例相关也不跟特定的类相关,推荐将其定义为一个staticmethod,这样不仅使代码一目了然,而且似的利于维护代码。子类调用方法隐形传入的参数为该对象所对应的类,调用过程中动态生成了对应
推荐度:
导读对于初学者如何理解@classmethod和@staticmethod:staticmethod相当于一个定义在类里面的函数,所以如果一个方法既不跟实例相关也不跟特定的类相关,推荐将其定义为一个staticmethod,这样不仅使代码一目了然,而且似的利于维护代码。子类调用方法隐形传入的参数为该对象所对应的类,调用过程中动态生成了对应
 staticmethod相当于一个定义在类里面的函数,所以如果一个方法既不跟实例相关也不跟特定的类相关,推荐将其定义为一个staticmethod,这样不仅使代码一目了然,而且似的利于维护代码。

子类调用方法隐形传入的参数为该对象所对应的类,调用过程中动态生成了对应的类的类变量。

理解classicmethod和staticmethod类是一种数据结构,可以创建对象。当调用类的时候就创建了一个类的实例对象。一旦对象被创建,python 就会检查是否实现了init()方法。如果init()已经被实现,那么它将被调用,实例对象作为第一个参数(self)被传递进去。

举个例子,定义一个存储日期信息的类Date,这里重新定义了初始化函数。

class Date(object):
 
 day = 0
 month = 0
 year = 0
 
 def __init__(self, day=0, month=0, year=0):
 self.day = day
 self.month = month
 self.year = year
 def tellDate(self):
 print 'Today is %s-%s-%s'%(self.day,self.month,self.year)

如果我们需要调用tell Date方法,我们就必须先创建一个实例,或者使用Date().tellDate()

date1 = Date()
date1.tellDate()

如何直接使用类名调用函数呢?

使用@classmethod或@staticmethod都可以类名.方法名()调用函数

现在假设我们需要创建很多Date的实例,日期信息以字符串的形式从外部传入,格式为'dd-mm-yyyy'。需要做的事

将日期信息字符串parse成一个含有年月日三个变量的元组;

实例化一个Date对象时就将年月日作为参数传入。

就像这样:

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

python不能像C++那样进行重载,所以我们引入class method ,它不需要self参数,但需要第一个参数是表示自身类的cls参数。

@classmethod
 def from_string(cls, date_as_string):
 day, month, year = map(int, date_as_string.split('-'))
 date1 = cls(day, month, year)
 return date1

使用时可以直接类名.方法名()

这样编程的好处有:

分解字符串操作可以重复使用,而我们只需要传入参数一次;

OOP;

cos是类本身,而不是类的实例,当我们将Date作为父类时,其子类也会拥有from_string方法

和class method很相似的是staticmethod,但它不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。

@staticmethod
 def is_date_valid(date_as_string):
 day, month, year = map(int, date_as_string.split('-'))
 return day <= 31 and month <= 12 and year <= 3999

所有程序及运行结果

class Date(object):
 day = 0
 month = 0
 year = 0
 
 def __init__(self, day=0, month=0, year=0):
 self.day = day
 self.month = month
 self.year = year
 
 def tellDate(self):
 print 'Today is %s-%s-%s'%(self.day,self.month,self.year)
 @classmethod
 def from_string(cls, date_as_string):
 day, month, year = map(int, date_as_string.split('-'))
 date = cls(day, month, year)
 return date
 
 @staticmethod
 def is_date_valid(date_as_string):
 day, month, year = map(int, date_as_string.split('-'))
 return day <= 31 and month <= 12 and year <= 3999
 
if __name__ == '__main__':
 date1 = Date()
 date1.tellDate()
 date2 = Date.from_string("14-04-2016")
 date2.tellDate()
 print Date.is_date_valid("14-04-2016")

运行结果为:

Today is 0-0-0
Today is 14-4-2016
True

文档

对于初学者如何理解@classmethod和@staticmethod

对于初学者如何理解@classmethod和@staticmethod:staticmethod相当于一个定义在类里面的函数,所以如果一个方法既不跟实例相关也不跟特定的类相关,推荐将其定义为一个staticmethod,这样不仅使代码一目了然,而且似的利于维护代码。子类调用方法隐形传入的参数为该对象所对应的类,调用过程中动态生成了对应
推荐度:
标签: 初学者 python class
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top