nonlocal
nonlocal 用来声明外层的局部变量
global 用来声明全局变量
【操作】使用nonlocal 声明外层局部变量
LEGB规则
local(函数或者类的方法内部)–>enclosed(嵌套函数,一个函数包裹另一个函数,闭包)–>global (模块中的全局变量)–>Built in (python 为自己保留的特殊名称)
面向对象
面向对象和面向过程
面向过程编程更加关注的是“程序的逻辑流程”,是一种执行者思维,适合小规模的程序。 思考–怎么按步骤实现?
面向对象编程更加关注的是“软件中对象之间的关系”,是一种设计者的思维,适合编写大规模的程序。 思考–怎么设计这个事物?
解决简单问题–使用面向过程
解决复杂问题–宏观上使用面向对象把握,微观处理上仍然是面向过程。
类
我们通过类定义数据类型的属性(数据)和方法(行为),也就是说,‘类将行为和状态打包在一起’
对象是类的具体实体,一般称为"类的实例“。从一个类创建对象时,每个对象会共享这个类的行为(类中定义的方法),但会有自己的属性值(不共享状态)。–方法代码是共享的,属性数据不共享。
构造函数_init_()
初始化创建好的对象,–给实例属性赋值
1.名称固定,必须为_init_()
2.第一个参数固定,必须为:self。self指的是刚刚创建好的实例对象,
3.构造函数通常用来初始化实例对象的实例属性
4.通过“类名(参数列表)”来调用构造函数。调用后,将创建好的对象返回给相应的变量。
实例属性 实例方法
实例方法是从属于实例对象的方法。
函数和方法的区别:
方法调用时,通过对象来调用。方法从属于特定实例对象,普通函数没有这个特点。
直观上看,方法定义需要传递self,函数不需要。
实例对象的方法调用本质:
a.Student()
a.say_score()------------Student.say_score(a)
类对象
class Student://解释器执行class语句时,会创建一个类对象
type–模具类-----Student学生类—学生实例
类属性
类属性从属于“类对象”的属性,也称为“类变量”。由于,类属性从属于类对象,可以被所有实例对象共享。`
类方法
类方法从属于“类对象”的方法 通过装饰器@classmethod来定义
1.@classmethod必须位于方法上面一行
2.第一个cls必须有;cls指的就是"类对象"本身;
3.调用类方法格式:“类名.类方法名(参数列表)”。参数列表中,不需要也不能给cls传值。
4.类方法中访问实例属性和实例方法会导致错误。
5.子类继承父类方法时,传入cls是子类对象,而非父类对象
静态方法
与“类对象”无关的方法。
1.@staticmethod必须位于方法上面一行
2.调用静态方法格式:“类名.静态方法名(参数列表)”。
3.类方法中访问实例属性和实例方法会导致错误。//实例对象不见得有
_del_方法(析构函数)和垃圾回收机制
python实现自动的垃圾回收,当对象没有被引用时(引用计数为0),由垃圾回收器调用_del_方法
我们也可以通过del语句删除对象,从而保证调用_del_方法。
系统会自动提供_del_方法,一般不需要自定义析构方法。
_call_方法和可调用对象
定义了_call_方法的对象,称为“可调用对象”,即该对象可以像函数一样被调用。
aa()
obj()—>call()