zoukankan      html  css  js  c++  java
  • staticmethod与classmethod

      staticmethod与classmethod的具体说明,请参考Python相关文档。

      以下举例子说明二者异同。

     1 # 旧式
    2 class Foo_Old(object):
    3 instance_str="Old style.I am a instance method."
    4 static_str="Old style.I am a static method."
    5 class_str="Old style.I am a class method."
    6 def __init__(self):
    7 pass
    8
    9 def instance_method(self):
    10 print(self.instance_str)
    11
    12 def static_method():
    13 print(Foo_Old.static_str)
    14 static_method=staticmethod(static_method) # 将static_method设置为静态方法。
    15
    16 def class_method(cls): # cls 就像self一样,是一个约定俗成的命名。
    17 print(cls.class_str)
    18 class_method=classmethod(class_method) # 将class_method设置为类方法。
    19
    20 foo_old=Foo_Old()
    21 foo_old.instance_method()
    22 foo_old.static_method()
    23 foo_old.class_method()
    24
    25 # Foo_Old.instance_method(Foo_Old)
    26 Foo_Old.static_method()
    27 Foo_Old.class_method()
    28 print("")
    29
    30 # 新式
    31 class Foo_New(object):
    32 instance_str="New style.I am a instance method."
    33 static_str="New style.I am a static method."
    34 class_str="New style.I am a class method."
    35 def __init__(self):
    36 pass
    37
    38 def instance_method(self):
    39 print(self.instance_str)
    40
    41 @staticmethod
    42 def static_method():
    43 print(Foo_New.static_str)
    44
    45 @classmethod
    46 def class_method(cls):
    47 print(cls.class_str)
    48
    49 foo_new=Foo_New()
    50 foo_new.instance_method()
    51 foo_new.static_method()
    52 foo_new.class_method()
    53
    54 # Foo_New.instance_method(Foo_New)
    55 Foo_New.static_method()
    56 Foo_New.class_method()
    57 print("")
    58
    59 # 继承
    60 class Foo_Sub(Foo_New):
    61 instance_str="Sub .I am a instance method."
    62 static_str="Sub .I am a static method."
    63 class_str="Sub .I am a class method."
    64 def __init__(self):
    65 pass
    66
    67 foo_sub=Foo_Sub()
    68 foo_sub.instance_method()
    69 foo_sub.static_method() # 行为与父类相同。
    70 foo_sub.class_method()
    71
    72 # Foo_Sub.instance_method(Foo_Sub)
    73 Foo_Sub.static_method() # 行为与父类相同。
    74 Foo_Sub.class_method()
    75 print("")

      共同:

        classmethod和staticmethod,都不需要建立类的实例,便可执行。

      差异:

        1,类调用 classmethod 时,第一个参数是隐式传入的“类的对象”,即代码中的 cls 。所以子类使用的是自己的信息,会覆盖父类的信息。

        2,staticmethod 不像 classmethod 能传入“类的对象”,被调用时不会区分父类与子类,按照统一的行为执行(按照最初定义执行)。所以staticmethod更像一个定义在类之中的“全局函数(global function)”,而不是一个普通的“方法(method)”。

  • 相关阅读:
    我非要捅穿这 Neutron(三)架构分析与代码实现篇(基于 OpenStack Rocky)
    我非要捅穿这 Neutron(二)上层资源模型篇
    $('.one + div')选取class为one的下一个元素
    15分钟,教你用Python爬网站数据,并用BI可视化分析!
    $("div span")选取里的所有的元素
    根据给定的元素名匹配元素
    根据给定的类名匹配元素
    根据给定的id匹配一个元素
    想创业,请问有没有投资小的项目?
    Vue组件间的通信
  • 原文地址:https://www.cnblogs.com/pyblogs/p/2343090.html
Copyright © 2011-2022 走看看