zoukankan      html  css  js  c++  java
  • (转)python3-staticmethod与classmethod

    原文:https://blog.csdn.net/youngbit007/article/details/68957848

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/youngbit007/article/details/68957848
    classmethod:类方法
    staticmethod:静态方法

    在Python中,静态方法和类方法都是可以通过类对象和类对象实例访问。但是区别是:

    @classmethod 是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法。 类方法的第一个参数cls,而实例方法的第一个参数是self,表示该类的一个实例。

    普通对象方法至少需要一个self参数,代表类对象实例

    类方法有类变量cls传入,从而可以用cls做一些相关的处理。并且有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。

    对于类方法,可以通过类来调用,就像C.f(),有点类似C++中的静态方法, 也可以通过类的一个实例来调用,就像C().f(),这里C(),写成这样之后它就是类的一个实例了。

    静态方法则没有,它基本上跟一个全局函数相同,一般来说用的很少

    classmethod必须使用类对象作为第一个参数,而staticmethod则可以不传递任何参数。

    class Date:

    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('-'))
    my_date = cls(day, month, year)
    return my_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__':
    my_date = Date.from_string('11-09-2012')
    print(my_date.day, my_date.month,my_date.year)
    is_date = Date.is_date_valid('13-13-2012')
    print(is_date)

    outputs:
    11 9 2012
    False
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    在来看另外的例子,为了验证有子类继承时,子类调用该类方法时,传入的类变量cls是子类,而非父类

    class A:
    @classmethod
    def cm(cls):
    print('类方法cm(cls)调用者:', cls.__name__)

    @staticmethod
    def sm():
    print('静态方法sm()被调用')

    class B(A):
    pass

    A.cm() # 类方法cm(cls)调用者: A
    B.cm() # 类方法cm(cls)调用者: B
    A.sm() # 静态方法sm()被调用
    B.sm() # 静态方法sm()被调用
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    下面我们来看为什么要用到staticmethod与classmethod。

    class Kls:
    def __init__(self,data):
    self.data = data
    def printd(self):
    print(self.data)

    ik1=Kls('arun')
    ik2=Kls('seema')
    ik1.printd()
    ik2.printd()

    # 如果现在我们想写一些仅仅与类交互而不是和实例交互的方法会怎么样呢? 我们可以在类外面写一个简单的方法来做这些,
    # 但是这样做就扩散了类代码的关系到类定义的外面. 如果像下面这样写就会导致以后代码维护的困难:
    def get_no_of_instances(cls_obj):
    return cls_obj.no_inst
    class Kls:
    no_inst = 0
    def __init__(self):
    Kls.no_inst = Kls.no_inst + 1
    ik1 = Kls()
    ik2 = Kls()
    print(get_no_of_instances(Kls)) # 2
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    应用classmethod

    class Kls(object):
    no_inst = 0
    def __init__(self):
    Kls.no_inst = Kls.no_inst + 1
    @classmethod
    def get_no_of_instance(cls_obj):
    return cls_obj.no_inst
    ik1 = Kls()
    ik2 = Kls()
    print(ik1.get_no_of_instance())
    print(Kls.get_no_of_instance())
    # 2
    # 2
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @staticmethod
    经常有一些跟类有关系的功能但在运行时又不需要实例和类参与的情况下需要用到静态方法

  • 相关阅读:
    准备 FRM 考试——方法、工具与教训
    930. 和相同的二元子数组 前缀和
    1906. 查询差绝对值的最小值 前缀和
    剑指 Offer 37. 序列化二叉树 二叉树 字符串
    815. 公交路线 BFS
    518. 零钱兑换 II dp 完全背包
    1049. 最后一块石头的重量 II dp
    5779. 装包裹的最小浪费空间 二分
    5778. 使二进制字符串字符交替的最少反转次数 字符串 滑动窗口
    474. 一和零 dp
  • 原文地址:https://www.cnblogs.com/liujiacai/p/10042881.html
Copyright © 2011-2022 走看看