在函数内部定义的函数,出了函数范围无法调用
功能:1.封装-数据隐藏,外部无法访问
2.贯彻DRY,降低重复代码
Nonlocal关键字nonlocal 用来声明外层的全局变量
global 声明模块中的全局变量
LEGB规则python在查找”名称“时,是按照LEGB规则查找的:
Local-->Enclosed-->Global-->Built in
Local指函数或者类的方法内部
Enclosed指的是嵌套函数
Global指模块中的全局变量
Built in指Python自己预留的名称
依次查找,如果都没有找到,就会出现一个Name Error
面向对象编程python是面向对象编程(主要)
python中一切皆对象,如数据类型、函数,都是对象
面向过程(Procedure Oriented)更加关注程序的逻辑流程,是一种执行者思维,适合编写小规模程序
首先思考如何按步骤实现
并将对应步骤变成方法,一步一步实现
面向对象(Object Oriented)设计者思维,适合编写大规模程序
首先思考怎么设计这个事物,但在底层细节仍要借助面向过程编程
思考方式先从问题中找名词(面向过程更多是找动词),确立名词哪些可以作为类,再根据问题需求确定类的属性和方法,确定类之间的关系。
对象的进化简单数据——数组(数量变多)——结构体(数据类型变复杂)——对象(处理数据的方式和逻辑变复杂)
Day14 Python基础知识 类的定义如果将对象比作一个“饼干”。类就是制造这个饼干的“摸具”
通过类定义数据类型的属性(数据)和方法(行为),也就是说,“类将行为和状态打包在一起”
定义的语法格式:
class 类名:
类体
类名首字母大写!
构造函数init()通过类名创建对象有两步方法:
1.init() 初始化创建好的对象,即“给实例属性赋值”
2.new() 用于创建对象,一般无需重新定义
要点:
1.名称固定,必须为init
2.第一个参数固定,必须为self
3.构造函数通常用来给实例属性赋值,如name、score
通过类名(参数列表)来调用构造函数,将创建好的对象返回给相应的变量
实例属性定义方法如下:
self.实例属性名=初始值
访问:
self.实例属性名
创建实例对象后,通过实例对象访问:
obj01=类名 #创建对象,调用init()初始化属性
obj01.实例属性名 = 值
新加的属性只在某对象中,若生成对象则没有
实例方法实例方法是从属于实例对象的方法,格式如下:
def 方法名(self[,形参列表]):
函数体
方法调用的格式如下:
对象.方法名([实参列表])
要点:
1.定义实例方法时,第一个参数必须为self.和前面一样,self指当前实例对象。
2.调用示例方法时,不需要也不能给self传参。self由解释器自动传参。
dir()获得对象的所有属性、方法
obj.dict 对象的属性字典
pass 空语句
isinstance(对象、类型) 判断对象是不是指定类型
类对象class 类名
实际上,在解释器执行class语句时,就会创建一个对象(类对象)
类属性和类方法类属性的定义方法:
class 类名
类变量名=初始值
访问:
类名.类变量名
类方法是从属于“类对象”的方法,通过装饰器@classmethod来定义,格式如下:
@classmethod
def 类方法名(cls [,形参列表]):
函数体
注意:
@classmethod在上面一行
第一个cls必须有
调用格式 类名.类方法名(参数列表) 参数列表中,不需要也不能给cls传值
静态方法与类无关的方法,和模块中定义普通函数没有区别,只不过放到类空间里,需要通过类调用
@staticmethod
def 方法名(形参列表):
del方法(析构函数)和垃圾回收机制用于实现对象被销毁时所需的操作。比如:释放对象占用的资源,例如:打开的文件、网络链接等
Pyhton实现垃圾自动回收,由垃圾回收器来调用析构方法
call方法和可调用对象定义了call方法的对象,成为"可调用对象",可以向函数一样被调用



