zoukankan      html  css  js  c++  java
  • python 中super方法、静态方法、类方法

    一、python中的super方法

    先上代码看个简单例子

     1 class A:
     2     def __init__(self):
     3         print('AA __init__')
     4 
     5 class B(A):
     6     def __init__(self):
     7         print("BB __init__")
     8 
     9 class C(A):
    10     pass
    11 
    12 class D(C, B):
    13     def __init__(self):
    14         print ('DD __init__')
    15         super().__init__()    # python3 中直接可以这样写, super中不传参
    16 
    17 d = D()

    结果输出:

    DD __init__
    BB __init__

    我们来看一下子类D的继承顺序:

    >>> print (D.__mro__)
    (<class '__main__.D'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)

    结论:super方法并不是我们所认为的那样,执行父类的方法,而是根据python中继承顺序的算法向前找的。

    二、静态方法、类方法

    类中的静态方法和类方法的定义方法分别用装饰器 @staticmethod 和 @classmethod 来定义,你可以将静态方法和类方法当成我们在程序中写的普通函数,它们和普通 def 函数不同之处在于:

    1:静态方法和类方法创建时是初始在类的名称空间当中的;

    2:静态方法和类方法的调用必须使用 类.方法名 的方式

    那么这两个类中的方法有什么用呢?其实你只要遵循python的语法语义,按照它的协议来,想怎么用全看你自己对python使用的灵活性,只要不违规就好。这里发个关于静态方法和类方法的例子:

     1 class Date:
     2     def __init__(self, year, month, day):
     3         self.year = year
     4         self.month = month
     5         self.day = day
     6     def __str__(self):
     7         return "Today is {year}/{month}/{day}.".format(year=self.year, month=self.month, day=self.day)
     8 
     9     @staticmethod
    10     def check_date_string(my_string):
    11         year, month, day = my_string.split("-")
    12         if int(year) > 0 and (int(month) > 0 and int(month) <= 12) and (int(day) > 0 and int(day) <= 31):
    13             return True
    14         return False
    15     
    16     @classmethod
    17     def format_date_string(cls, my_string):
    18         year, month, day = my_string.split("-")
    19         return cls(year, month, day)
    20 
    21 dt = Date('2019', '1', '20')
    22 print(dt)
    23 print ("*"*10)
    24 
    25 str1 = "2019-18-9"    # 月份写错
    26 print(Date.check_date_string(str1))
    27 print ("*"*10)
    28 
    29 str2 = "2019-11-22"
    30 print(Date.check_date_string(str2))    
    31 print(Date.format_date_string(str2))    # 类方法,返回一个Date对象,print时打印 __str__

    代码当然不严谨,不过只是写个简单例子旨在说明静态方法和类方法的一种应用场景,输出如下:

    Today is 2019/1/20.
    **********
    False
    **********
    True
    Today is 2019/11/22.

    真正写代码时要视实际需求,来灵活使用python类和对象中的知识,构建自己的程序。

  • 相关阅读:
    每日思考(2020/07/13)
    每日思考(2020/07/12)
    每日思考(2020/07/11)
    每日思考(2020/07/10)
    每日思考(2020/07/09)
    每日思考(2020/05/12)
    Apache服务器的下载与安装
    知问前端——验证插件(二)
    知问前端——验证插件(一)
    知问前端——日历UI(三)
  • 原文地址:https://www.cnblogs.com/sqtu/p/10298848.html
Copyright © 2011-2022 走看看