文章目录
1. 嵌套函数
作用:
1.封装,数据隐藏
2.贯彻DRY原则
3.
def printName(isChinese,name,familyName):
def inner_print(a,b):
print("{0} {1}".format(a,b))
if isChinese:
print("{0} {1}".format(name,familyName))
else:
print("{0} {1}".format(familyName,name))
printName(1,"小七","高")
2. nonlocal关键字
nonlocal 用来声明外层的局部变量
global 用来声明全局变量
#测试nonlocal/global关键字的用法
a = 100
def outer():
b = 10
def inner():
nonlocal b #声明外部函数的局部变量
print("inner:",b)
b = 20
global a #声明全局变量
a = 1000
inner()
print("outer b:",b)
outer()
3. LEGB规则
local 指的就是函数或者类的方法内部
enclosed 指的是嵌套函数
global 指的是模块中的全局变量
bulit in 指的是Python为自己保留的特殊名称
#测试LEGB
str = "global"
def outer():
str = "outer"
def inner():
str = "inner"
print(str)
inner()
outer()
4. 面向对象
4.1 面向过程思维
“执行者”思维,适合编写小规模程序
“怎么按照过程实现?”
4.2 面向对象思维
“设计者”思维,适合编写大规模程序
“怎么设计这个事物?”
4.3 对象的进化
数–数组–结构体–对象
4.4 类的定义,类和对象的关系
#类和对象的关系
class Student: #类名一般首字母大写,多个单词采用驼峰原则
def __init__(self,name,score): #self必须位于第一个参数
self.name = name
self.score = score
def say_score(self): #self必须位于第一个参数
print("{0}的分数是:{1}".format(self.name,self.score))
s1 = Student("高其",18)
s1.say_score()
4.5 构造函数
1.写法:init()
2.第一个参数固定必须为self,名字可以随便改,建议叫self
4.6 实例属性、实例方法
定义实例方法需要self作为第一个参数,定义函数不需要
#类和对象的关系
class Student: #类名一般首字母大写,多个单词采用驼峰原则
def __init__(self,name,score): #self必须位于第一个参数
self.name = name
self.score = score
def say_score(self): #self必须位于第一个参数
print("{0}的分数是:{1}".format(self.name,self.score))
s1 = Student("高其",18) #通过类名()调用构造函数
s1.say_score()
s1.age = 30
s1.salary = 3000
del s1
print(s1.salary)
s2 = Student("高小二",16)
s2.say_score() # ==Student.say_score(s2)
4.7 其他方法
dir(obj) 可以获得obj的所有属性和方法
ibj.dict 对象的属性字典
pass 空语句
isinstance(s2,Man)判断s2是不是属于Man这个类
5. 类对象、类属性、类方法
#类和对象的关系
class Student: #类名一般首字母大写,多个单词采用驼峰原则
company = "SXT" #类属性
count = 0 #类属性
def __init__(self,name,score):
self.name = name #实例属性
self.score = score
Student.count = Student.count + 1
def say_score(self): #实例方法
print("{0}的分数是:{1}".format(self.name,self.score))
stu2 = Student
s1 = Student("高琪",60) #s1是实例对象,自动调用__init__()方法
s1.say_score()
s2 = stu2("高二琪",50)
s2 = stu2("高三琪",45)
print("一共创建{}个Student对象".format(Student.count))
类方法
@classmethod
def 类方法名(cls[,形参列表])
静态方法
@staticmethon
def 静态方法名([形参列表])
函数体
#测试类方法
class Student1: #类名一般首字母大写,多个单词采用驼峰原则
company = "SXT" #类属性
@classmethod
def printCompany(cls):
print(cls.company)
Student1.printCompany()
#测试静态方法
class Student2:
company = "SXT" #类属性
@staticmethod
def add(a,b): #静态方法
print("{0}+{1}={2}".format(a,b,(a+b)))
return a+b
Student2.add(20,30)
6. __del__方法 析构函数和垃圾回收机制
当对象的引用计数为0时,有垃圾回收机制调用__del__方法
#析构方法
class Person:
def __del__(self):
print("销毁对象{0}".format(self))
p1 = Person()
p2 = Person()
del p2
print("程序结束")
6. __call__方法 和调用对象
对象可以像函数一样被调用
#测试可调用方法__call__()
class SalaryAccount:
'''工资计算类'''
def __call__(self,salary):
print("算工资啦……")
yearSalary = salary*12
daySalary = salary//22.5 #国家规定每月平均工作天数
hourSalary = daySalary//8
return dict(yearSalary=yearSalary,monthSalary=salary,daySalary=daySalary,hourSalary=hourSalary)
s = SalaryAccount()
print(s(30000))