python 函数def 和 类class 基础

函数def

'''
python 函数
def 函数名(参数列表):
    函数体

如果参数要指定数据类型,
参数名:数据类型
num : int
str1 : str
list1 : list
dict1 : dict
set1 : set
'''
def addNum(a: int, b: int, c: int):
    return a + b + c

def addNum2(a: int, b: int, c: int):
    total = a + b + c
    return

num = addNum(1, 2, 3)
num2 = addNum2(1, 2, 3)
print(num)  # 6
print(num2)  # None

如果没有return就没有返回值,只写return,返回None

'''
函数参数列表,可以设置不定长参数
def 函数名(arg1,*args)     *args: 函数用元组接收参数
def 函数名(arg1,**args)   **args: 函数用字典接收参数
* 和 ** 可以同时出现,不过*只能在**前面,不然会报错
def 函数名(arg1,*,arg2,arg3,arg4) 表示: * 号之后的参数必须用字典类型传入
'''

def para(arg1,*args):
    print(arg1)
    print(args)

def para1(arg1,**kwargs):
    print(arg1)
    print(kwargs)

def para2(arg1,*args,**kwargs):
    print(arg1)
    print(args)
    print(kwargs)

def para3(arg1,*,arg2,arg3):
    print(arg1)
    print(arg2)
    print(arg3)

para(1,2,3,4)
para1(1,a=2,b=3,c=4)
para2(1,11,111,a=2,b=3,c=4)
para3(1,arg2=2,arg3=3)
'''
1
(2, 3, 4)
1
{'a': 2, 'b': 3, 'c': 4}
1
(11, 111)
{'a': 2, 'b': 3, 'c': 4}
1
2
3
'''

类class

'''
类用class标识
class 类名:
    ...

class 类名(继承类名): # python支持多继承,
    ...
有几个名词:
1. 方法解析顺序(Method Resolution Order),简称 MRO
python 刚开始的时候多继承方法解析顺序采用了深度优先搜索算法(DFS),在python2.2版本,引入了
新式类,新式类在深度优先搜索算法的基础上做了优化,但是类的解析顺序不是单调性的,所以在python2.3版本,对新式类采用了C3算法
class.mro(): 此方法可以被一个元类来重载,用来解析类实例的解析顺序,会在类实例化的时候调用,结果存储于__mro__之中
class.__mro__: 此属性是由类组成的元组,在方法解析期间会基于它来查找基类

2. 新式类和旧式类
旧式类(经典类): python2.2之前的类都是经典类,声明类的时候不用显式的继承object,采用的算法是深度优先搜索算法
              python2.2引入新式类,声明类的时候显式的继承object,MRO算法采用C3算法,在python2中,经典类MRO
              算法还是深度优先,新式类则采用C3算法
新式类: python3中,支持新式类,所以不论是否显式的继承了object,都是新式类,MRO算法都采用了C3算法,广度优先
'''


class A:
    def getName(self):
        print('A')


class B(A):
    # def getName(self):
    #     print('B')
    pass


class C(A):
    def getName(self):
        print('C')


class D(B, C, A):
    pass


'''
        A
      / | \ 
     B  |  C
      \ | /
        D
'''
print(D.mro())
d = D()
d.getName()
'''
广度搜索: 先在D中找,如果没有,搜索B,如果没有,不会深入B的父类A,而是依次找C
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
B
注释掉B的getName之后,结果如下:
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
C
'''

猜你喜欢

转载自blog.csdn.net/zZsSzss/article/details/103167054