嵌套函数(内部函数)
在函数中调用其内部方法
在哪里定义在哪里使用 外部无法调用
在哪里产生在哪里使用 (局部使用)
主要作用: 1 封装隐藏
2 降低重复代码
3 闭包(后期研究)
nonlocal
作用:被嵌套的内部函数要使用外部函数的变量
LEGB规则
python中查找名称时按照LEGB规则
Local 函数或者类的方法内部
Enclosed 指的是嵌套函数(一个函数包裹另一个函数,闭包)
Global 模块中的全局变量
Build in 指的是python为自己保留的特殊名称(内置函数)
总结:内部优先 默认最后`
#str = "asdasd"# #G#
def outer():
#str = "attyuar"# #E#
def inner():
#str = "ssuuaok" #L#
print(str)
inner()
print(str) #B#
outer()
python 面向对象编程
基本功能 继承 多态 封装
宏观 面向对象(设计者思维)
微观 面向过程 (执行者思维)
模块化思维 整体统合
面向复杂的过程 找动词
面向对象 找名词
对象的进化
结构体(数据的集合体)
对象(不光有数据 还有处理数据的方法 的综合结合体)
有处理方法的结构体 为 对象
类的定义
一般类名的第一个字母大写
构造方法"__" 双下划线
class Student:
def __init__(self,name,score):
self.name = name
self.score = score
def say(self):
print("{0}的分数是{1}".format(self.name,self.score))
s1 = Student("周大福",99)
s1.say()
(所有的类之中的定义方法)所有的构造器 第一个参数一定要是"self"(也可以是其他但习惯统一使用self)
s1 = Student(“周大福”,99)
其实同时调用了两个方法
1 init() 初始化创建好的对象 初始化指的是:给实例属性赋值
2 new() 用于创建对象 但一般我们无需重新定义该方法(看不到)
实例
实例从属于对象 也叫实例变量
继承类的同时 可以有自己特点的独立个体
s1 具有name score两个属性
同时还可以增加属性
s1.age = 18
s1.salary = 20000
age 和 salary 会加入成为 s1这个实例新的属性
但只属于实例s1
如果过在创建 新的实例 s2 只具备类的两个属性 与 s1增加的两个属性 age 与 salary 和新的实例s2 不发生关联 也没有从属关系.
实例方法
定义实例方法
def 方法名 self 形参
两种写法:
s1 = Student()
s1.say() 解释器翻译 Student.say(s1)
两种写法都合理
print(dir(s1)) #获得对象所有属性和方法#
print(s1.__dict__) #获得所定义的属性#
print(isinstance(s1,Student)) #判断是否是该类的实例对象#
class stf: # Pass占位之用 可用于类和方法#
pass
def sef():
pass
类对象
类属性
class Student:
company = "SXT"#类属性#
count = 0 #类属性#
def __init__(self,name,score):
self.name = name #实例属性#
self.score = score #实例属性#
Student.count = Student.count+1
def say(self): #实例方法#
print("我们公司:",Student.company)
print(self.name,"的分数是:",self.score)
s1 = Student("小赵",75)
s1.say()
s2 = Student("小赵1",76)
s3 = Student("小赵2",77)
print("一共创建了{0}个Student对象".format(Student.count))
当创建一个class类之时 首先会去调用"模具" -----> type类
self.name = name #实例属性#
self.score = score #实例属性#
两个实例属性包含在 此时的Student类之中
另外用来处理实例的实例方法say() 也在Student类之中
而此时两个实例属性
self.name = name #实例属性#
self.score = score #实例属性#
不存在
只有在实例化出新的对象才会 获得实例属性(s1,s2,s3)
实例对象 再通过调用的方式 从Student类中获取 实例方法say()
示意图:
类方法/静态方法
类方法 是从属于类的方法
通过装饰器@classmethod来定义
格式如下:
@classmethod
def 类方法名 [cls,形参列表] (对应实例方法的"self"记忆)
函数体
代码示例
class Student:
company = "SYD"
@classmethod
def gsname(cls):
print(cls.company)
Student.gsname()
类函数与之前提到过的实例函数一样 存在于student类中
但在实例中却不存在,也不可调用类方法
静态方法
@staticmethod
def 静态方法名([形参列表]):
函数体
要点
1 @staticmethod必须位于方法的上面
2 类名.静态方法(参数列表)
3 静态方法中访问实例方法 和 实例属性 会导致错误
*类方法和静态方法不可以调用 实例变量 和 实例方法(类方法和静态方法发生在创建实例之前,实例不存在,实例变量和实例方法也就不存在,因此无法调用)
析构函数
del 用于对象销毁的工作
__call__方法和可调用对象