一、嵌套函数
def AA():
print("AA")
def aa(): #嵌套函数
print("aa")
aa()
AA()
避免重复代码:
1、未使用嵌套:
def AA(a,b):
print(a,b)
def BB(a,b):
print(b,a)
AA(1,2) # 调用AA()
BB(1,2) # 调用BB()
输出结果:
2、使用嵌套:
def CC(a,b,isAA):
def Cc(a,b):
print(a,b)
if isAA:
Cc(a,b)
else:
Cc(b,a)
CC(1,2,True) # 调用AA()
CC(1,2,False) # 调用BB()
二、nonlocal关键字
def AA():
b = list(range(6)) #可变对象列表
bb = {"name":"AA","age":16} #可变对象字典
c = 20 #不可变对象int
def BB():
b.append("AA") #对可变对象(列表)进行修改
print(b)
bb["sex"] = "boy" #对可变对象(字典)进行修改
print(bb)
nonlocal c #对不可变对象(int)进行修改时必须使用 nonlocal 关键字声明后才能修改
c = 21
print(c)
BB()
AA()
三、LEGB规则
a = "abc"
def AA():
a = "ABC"
def Aa():
a = "abcd"
print(a)
Aa()
AA()
(1)将嵌套函数的变量赋值给注释掉后:
a = "abc"
def AA():
a = "ABC"
def Aa():
# a = "abcd"
print(a)
Aa()
AA()
(2)将最外层函数的变量赋值语句给注释掉后:
a = "abc"
def AA():
# a = "ABC"
def Aa():
# a = "abcd"
print(a)
Aa()
AA()
四、面向对象编程
1、面向对象和面向过程的区别
2、对象的进化
五、类的定义
class Aa:
a = 100
def __init__(self, name, age): #构造函数,函数名为固定的: __init__()
self.A = name #属性
self.B = age
def BB(self):
print(self.A, self.B)
C = Aa("小明",16) # 类名(元素1, 元素2.....) 此为调用构造方法,将"小明"带入"name" , 16带入"age",传入属性A和B
C.BB() # 调用方法BB()输出属性A和B的值
Aa("小明",16).BB() # 等同于上面
2、构造函数
3、实例属性
4、实例方法
class Aa:
a = 100
def __init__(self, name, age): #构造函数,函数名为固定的: __init__()
self.A = name #属性
self.B = age
def BB(self):
print(self.A, self.B)
C = Aa("小明",16) # 类名(元素1, 元素2.....) 此为调用构造方法,将"小明"带入"name" , 16带入"age",传入属性A和B
C.BB() # 调用方法BB()输出属性A和B的值
Aa("小明",16).BB() # 等同于上面
C.sex = "boy" # 往类里添加属性 sex 值为:"boy"
print(C.A , C.B , C.sex) # 输出所有属性
class Aa:
ea = 100
def __init__(self, name, age): #构造函数,函数名为固定的: __init__()
self.A = name #属性
self.B = age
def BB(self):
print(self.A, self.B)
C = Aa("小明",16) # 类名(元素1, 元素2.....) 此为调用构造方法,将"小明"带入"name" , 16带入"age",传入属性A和B
C.BB() # 调用方法BB()输出属性A和B的值
Aa("小明",16).BB() # 等同于上面
C.sex = "boy" # 往类里添加属性 sex 值为:"boy"
print(C.A , C.B , C.sex)
print(dir(C)) # 输出该类下对象的所有属性和方法
print(C.__dict__) # 输出该类下对象的所有的属性字典
pass # 空语句
print(isinstance(C,Aa)) # 判断对象是否属于那个类型
输出结果:
小明 16
小明 16
小明 16 boy
['A', 'B', 'BB', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'ea', 'sex']
{'A': '小明', 'B': 16, 'sex': 'boy'}
True
Process finished with exit code 0
六、类对象
class Aa:
ea = 100
def __init__(self, name, age): #构造函数,函数名为固定的: __init__()
self.A = name #属性
self.B = age
def BB(self,a,b):
print(self.A, self.B)
print(a,b)
X = Aa # 将类对象给到X
Xb = X("小红",18) # 将该类的构造函数给到Xb
Xb.BB(1,2) # 执行BB()方法
1、类属性和类方法
(1)、类属性
class AA:
A = "大" #类属性
B = "小" #类属性
def __init__(self): #构造方法
self.a = "多" #实例属性
self.b = "少" #实例属性
def Aa(self): #实例方法
print("实例属性a:{0}, 实例属性b:{1}, 类属性A:{2}, 类属性B:{3}".format(self.a, self.b, AA.A, AA.B)) #类属性调用方式为:类名.属性名
aA = AA()
aA.Aa()
(2)、类方法
class AA:
cc = "Hellow Python" # 类属性
@classmethod # 类方法开头声明
def Aa(cls): # 类方法
print(AA.cc)
AA.Aa() # 调用类方法
2、静态方法
class AA:
@staticmethod # 静态方法声明
def Aa(a): # 静态方法
print(a)
AA.Aa("你好") # 静态方法调用
class AA:
def __init__(self,a,b):
self.aa = a
self.bb = b
@staticmethod # 静态方法声明
def Aa(a): # 静态方法
print(a)
print(self.aa) # 静态方法中无法调用实例属性和方法,都则会报错
AA.Aa("你好") # 静态方法调用
七、析构函数
class AA:
def __init__(self ,a ,b):
self.A = a
self.B = b
def __del__(self): # 重写析构函数
print("对象{0}已销毁".format(self))
Aa = AA(1,2) # 实例化对象Aa
Ab = AA(1,2) # 实例化对象Ab
del(Aa) # 销毁对象Aa
print(Ab) # 输出Ab
print(Aa) # 输出Aa
注:对象已被销毁后再次使用时会报错
八、__call__方法
class AA:
def __call__(self, a): # 调用对象时默认执行的方法
A1 = a * 2
A2 = a / 2
A3 = a + 2
A4 = a - 2
return dict(A1 = A1, A2 = A2, A3 = A3, A4 = A4) # 返回字典
Aa = AA() # 实例化对象给Aa
print(Aa(1000)) # 输出返回值