python的类方法、静态方法,及为什么使用静态方法

类方法:

是类对象所拥有的方法需要用classmethod来标识,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数(当然可以用其他名称的变量,但我们一般习惯使用'cls'了),能够通过实例对象和类对象去访问。

class People(object):
  # 类属性
  country = 'China'

  # 类方法,用classmethod来进行修饰
  @classmethod
  def get_country(cls):
    return cls.country

p = People()
print(p.get_country())    # 可以用过实例对象引用
print(People.get_country())    # 可以通过类对象引用

类方法还可以用来修改类属性:

class People(object):
  # 类属性
  country = 'China'

  # 类方法,用classmethod来进行修饰
  @classmethod
  def get_country(cls):
    return cls.country

  @classmethod
  def set_country(cls, country):
    cls.country = country

p = People()
print(p.get_country())   # 可以用过实例对象访问
print(People.get_country())    # 可以通过类访问

p.set_country('British')   # 修改类属性

print(p.get_country())
print(People.get_country())

静态方法:

需要通过修饰器@staticmethod来进行修饰,静态方法不需要多定义参数('self'或'cls'),可以通过对象和类来访问。

class People(object):
  country = 'China'

  @staticmethod
  # 静态方法
  def get_country():
    return People.country

p = People()
# 通过对象访问静态方法
p.get_contry()

# 通过类访问静态方法
print(People.get_country())

总结:

  • 从类方法和实例方法以及静态方法的定义形式就可以看出来,类方法的第一个参数是类对象cls,那么通过cls引用的必定是类对象的属性和方法。
  • 实例方法的第一个参数是实例对象self,那么通过self引用的可能是类属性、也有可能是实例属性(这个需要具体分析),不过在存在相同名称的类属性和实例属性的情况下,实例属性优先级更高。
  • 静态方法中不需要额外定义参数,因此在静态方法中引用类属性的话,必须通过类实例对象来引用。

为什么使用静态方法:

静态方法主要是用来存放逻辑性的代码,主要是一些逻辑属于类,但是和类本身没有交互,即在静态方法中,不会涉及到类中的方法和属性的操作。可以理解为将静态方法存在此类的名称空间中。事实上,在python引入静态方法之前,通常是在全局名称空间中创建函数,但这样会导致代码难以维护。

举个例子,我们来定义一个类来获取当前时间:

import time
class TimeTest(object):

  def __init__(self, hour, minute, second):
    self.hour = hour
    self.minute = minute
    self.second = second

  @staticmethod   
  def showTime():      
    return time.strftime("%H:%M:%S", time.time())

print(TimeTest.showTime()) 
t = TimeTest(2,10,10)
nowTime = t.showTime()
print(nowTime)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容

  • 一 “老前辈,你可曾在附近看到过一柄剑?”林清辰走到郁郁葱葱的岸边对着垂钓的老人说。 老人抬起浑浊的双眼打量起林...
    雨石mz阅读 671评论 2 2
  • /细水长流 童稚提灯邀赏月,玉盘未见问千般。 莫非窃药嫦娥悔,断线珍珠落世间。
    细水长流瑜阅读 624评论 2 10
  • 去年冬天的一个傍晚,和朋友逛花市,在一家店买了这盆绿萝。买绿萝,一是好养,二是装饰效果好,三是便宜,连花带花架,才...
    丁香与海阅读 256评论 0 2