嵌套函数
在函数内部定义的函数,也叫内部函数
调用嵌套函数。在外部函数里面使用,在外部函数外部不能使用
什么情况下用嵌套函数:
封装-数据隐藏,。嵌套函数让我们在函数内部避免重复代码
nonlocal关键字
用来声明外层函数的局部变量
LEGB规则
python在查找名称时按照这个规则来查找
Local -》Enclosed->Global->Built in
local 函数或者类的方法内部
enclosed 嵌套函数(一个函数包裹另一个函数,闭包)
global 模块中的全局变量
Built in Python为自己保留的特殊名称
如果在这些所有命名空间中都没有找到会产生一个NameError
面向对象编程
继承 多态 封装
面向对象和面向过程
都是解决问题的思维方式,都是代码组织的方式
解决简单问题可以使用面向过程
解决复杂问题宏观上使用面向对象把握,微观上是面向过程
类和对象
对象的结构:方法和属性
属性需要定义在一个特殊的方法里面:构造方法 __init__(self) self 当前对象本身
类内的方法,self必须位于第一个参数
构造函数__init__() 实例对象的初始化工作
通常用来初始化实例对象的实例属性
通过类名(参数列表)来调用构造函数
class Student:
def __init__(self,name,score):
self.name = name
self.score = score
s1 = Student("张三",18)
__init__()给实例属性赋值
__new__() 无需定义,创建对象
实例属性
从属于实例对象的属性,实例变量
self.实例属性名= 初始值
可以给对象新加属性并赋值,该属性不在构造函数里面 ,只是对这一个对象起作用
实例方法
实例方法是从属于实例对象的方法,第一个参数必须为self,self指的是当前的实例对象,调用实例对象时不需要给self传参,解释器自动传参。
a = Student()
a.say_score() 解释器翻译: Student.say_score(a)
dir(obj) 可以获得该对象所有属性和方法
obj.__dic__ 对象的属性字典
pass 空语句
isinstance(对象,类型) 判断对象是不是指定类型。
类对象
当解释器执行class语句时,就会创建一个类对象
类的信息也是需要一个对象来保存的
类也是对象可以赋值 Stu2 = Student
类属性
类属性是从属于类对象的属性,也成为类变量,可以被所有实例对象共享
类变量名= 初始值
类方法
类方法是从属于类对象的方法,通过装饰器@classmethod来定义,修饰类的方法
@classmethod
def 类方法名(cls[,形参列表】)
调用类方法格式:类名。类方法名(参数列表) 参数列表中不需要给cls传值
类方法中访问实例属性和实例方法会导致错误,子类继承父类方法时,传入cls是子类对象,而非父类对象
class Student:
company = "yzy"
@classmethod
def printCompany(cls):
print(cls.company)
Student.printCompany() #类方法
静态方法
与类对象无关的方法
通过类名来访问,实际和类没什么关系,和放在模块中的方法一样。
通过装饰器@staticmethod来定义
调用方式:类名.静态方法名(参数列表)
静态方法中访问实例属性和实例方法会导致错误
__del__析构方法 垃圾回收
实现对象被销毁时所需的操作,
python自动实现垃圾回收,对象没有被引用时,垃圾回收器调用__del__方法
可以通过del语句删除对象,从而保证调用__del__方法
系统会自动提供该方法,一般不需要自定义析构方法
__call__方法和可调用对象
定义了__call__方法的对象,称为可调用对象,可以像函数一样被调用
a = 30 b = 50 c = a + b d = a.__add__(b)
class SalaryAccount:
def __call__(self, salary):
print(xxxxx)
s = SalaryAccount()
print(s(3000)) #可以调用对象s,调用该对象的__call__方法