Python探索之静态方法和类方法的区别详解
面相对象程序设计中,类方法和静态方法是经常用到的两个术语。
逻辑上讲:类方法是只能由类名调用;静态方法可以由类名或对象名进行调用。
pythonstaticmethodandclassmethod
Thoughclassmethodandstaticmethodarequitesimilar,there'saslightdifferenceinusageforbothentities:classmethodmusthaveareferencetoaclassobjectasthefirstparameter,whereasstaticmethodcanhavenoparametersatall. Let'slookatallthatwassaidinrealexamples.
尽管classmethod和staticmethod非常相似,但在用法上依然有一些明显的区别。classmethod必须有一个指向类对象的引用作为第一个参数,而staticmethod可以没有任何参数。
让我们看几个例子。
例子–Boilerplate
classDate(object): def__init__(self,day=0,month=0,year=0): self.day=day self.month=month self.year=year
很明显,这个类的对象可以存储日期信息(不包括时区,假设他们都存储在UTC)。
这里的init方法用于初始化对象的属性,它的第一个参数一定是self,用于指向已经创建好的对象。
Let'sassumethatwewanttocreatealotofDateclassinstanceshavingdateinformationcomingfromoutersourceencodedasastringofnextformat(‘dd-mm-yyyy').Wehavetodothatindifferentplacesofoursourcecodeinproject.
利用classmethod可以做一些很棒的东西。
比如我们可以支持从特定格式的日期字符串来创建对象,它的格式是(‘dd-mm-yyyy')。很明显,我们只能在其他地方而不是init方法里实现这个功能。
Parseastringtoreceiveday,monthandyearasthreeintegervariablesora3-itemtupleconsistingofthatvariable.
InstantiateDatebypassingthosevaluestoinitializationcall.
Thiswilllooklike:
大概步骤:
解析字符串,得到整数day,month,year。
使用得到的信息初始化对象
代码如下
day,month,year=map(int,string_date.split('-')) date1=Date(day,month,year)
理想的情况是Date类本身可以具备处理字符串时间的能力,解决了重用性问题,比如添加一个额外的方法。
C++可以方便的使用重载来解决这个问题,但是python不具备类似的特性。所以接下来我们要使用classmethod来帮我们实现。
@classmethod deffrom_string(cls,date_as_string): day,month,year=map(int,date_as_string.split('-')) date1=cls(day,month,year) returndate1 date2=Date.from_string('11-09-2012')
We'veimplementeddatestringparsinginoneplaceandit'sreusablenow.
Encapsulationworksfinehere(ifyouthinkthatyoucouldimplementstringparsingasasinglefunctionelsewhere,thissolutionfitsOOPparadigmfarbetter).
clsisanobjectthatholdsclassitself,notaninstanceoftheclass.It'sprettycoolbecauseifweinheritourDateclass,allchildrenwillhavefrom_stringdefinedalso.
让我们在仔细的分析下上面的实现,看看它的好处。
我们在一个方法中实现了功能,因此它是可重用的。这里的封装处理的不错(如果你发现还可以在代码的任意地方添加一个不属于Date的函数来实现类似的功能,那很显然上面的办法更符合OOP规范)。cls是一个保存了class的对象(所有的一切都是对象)。更妙的是,Date类的衍生类都会具有from_string这个有用的方法。
Whataboutstaticmethod?It'sprettysimilartoclassmethodbutdoesn'ttakeanyobligatoryparameters(likeaclassmethodorinstancemethoddoes).
Let'slookatthenextusecase.
Wehaveadatestringthatwewanttovalidatesomehow.ThistaskisalsologicallyboundtoDateclasswe'veusedsofar,butstilldoesn'trequireinstantiationofit.
Hereiswherestaticmethodcanbeuseful.Let'slookatthenextpieceofcode:
staticmethod没有任何必选参数,而classmethod第一个参数永远是cls,instancemethod第一个参数永远是self。
@staticmethod defis_date_valid(date_as_string): day,month,year=map(int,date_as_string.split('-')) returnday<=31andmonth<=12andyear<=3999 #usage: is_date=Date.is_date_valid('11-09-2012')
所以,从静态方法的使用中可以看出,我们不会访问到class本身–它基本上只是一个函数,在语法上就像一个方法一样,但是没有访问对象和它的内部(字段和其他方法),相反classmethod会访问cls,instancemethod会访问self。
以上就是本文关于Python探索之静态方法和类方法的区别详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:Python探索之爬取电商售卖信息代码示例、Python面向对象编程基础解析(一)等,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持。