Python第三周之面向对象之深刻学习 (函数。参数 嵌套函数 装饰器 作用域 类和对象 七大原则)
函数
名字
命名方法(官方方法,驼峰命名法)
命名原则:1.由数字,下划线和字母组成,且不能由数字开头。
2.不能命名关键字
3.区分大小写,大写为常量
参数
默认值
可变参数 * args
def say_hello(*args): print(args) def main(): a_list = [1, 2, 3, 4, 5, 'zhangli', 24] say_hello(*a_list) if __name__ == '__main__': main()
关键字参数 **kwargs
def say_hello(**kwargs): print(kwargs) def main(): a_set = {'name': 'zhangli','age': 24, 'sex': 'female'} say_hello(**a_set) if __name__ == '__main__': main()
命名关键字参数 *
def foo(a, b, c, *, name, age): print(a+b+c) print(name, ':', age) def main(): foo(1, 2, 3, name='zhang', age=24) if __name__ == '__main__': main()
返回值
对象
字符串
元组
集合
嵌套函数
高阶函数 函数里面再次调用函数
# 通过向函数中传入函数,可以写出更通用的代码
# calc函数中的第二个参数是另一个函数,他代表了一个二元运算
# 所以calc函数变得通用性更强,可以由传入的第二个参数来决定到底做什么
# 高内聚, 低耦合 high cohesion low coupling
def calc(my_list, op): total = my_list[0] for index in range(1, len(my_list)): total = op(total, my_list[index]) return total def add(x, y): return x + y def mul(x, y): return x * y def main(): my_list = [1, 3, 5, 7, 9] print(calc(my_list, add)) print(calc(my_list, mul)) if __name__ == '__main__': main()
# 装饰器
def record(fn): def wrapper(*args, **kwargs): print('准备执行%s函数之前...' % fn.__name__) print(args) print(kwargs) # 此行代码在执行被装饰的函数 # 在这行代码的前后我们可以附加其他的代码 # 这些代码可以让我们在执行函数时做一些额外的工作 val = fn(*args, **kwargs) print('%s函数执行完成' % fn.__name__) return val return wrapper # 通过修饰器修饰f函数,让f函数在执行时,可以进行更多的操作 @record # 合二为一 def f(n): if n == 0 or n == 1: return 1 return n * f(n-1) if __name__ == '__main__': print(f(5)) # 装饰器 让我们看出函数里面到底发生了什么。
lambda函数 (匿名函数)-- 此函数极短,故简写,直接写在放参数的括号里
闭包
偏函数
柯里化
作用域
局部作用域
嵌套作用域
全局作用域
内置作用域
标志符 LEGB local enclose global build_in (nonlocal global)
类和对象
类的定义
1.类是对象的蓝图和模板,有了类就可以定义对象
2.类最重要的就是数据抽象和行为抽象
3.数据抽象:抽取对象的共有的静态特征 -- 属性
4.行为抽象:抽取对象的共有的行为特征 -- 行为
对象的关系
use a 依赖关系(作用和反作用)
have a 关联(普通/ 聚合/合成)(你中有我,我中有你)
is a 继承关系 从已经有的类创建新类的过程
# 提供继承信息的称为父类(超类/基类)
# 得到继承信息的称为子类(派生类/衍生类)
# 通过继承我们可以将子类中的重复代码,抽取到父类中。
# 子类通过继承,并复用这些代码,来减少重复代码的编写
# 将来如果要维护子类的公共代码,只需要在父类中进行操作即可
七大原则
单一职责原则
开闭原则
依赖倒转原则
里氏替换原则
接口隔离原则
合成聚合复用原则
迪米特法则