嵌套函数 定义在函数内部的函数 应用场景:
- 封装 - 数据隐藏 外部无法访问“嵌套函数”。
- 贯彻 DRY(Don’t Repeat Yourself) 原则 嵌套函数,可以让我们在函数内部避免重复代码。
- 闭包
nonlocal关键字 用来声明外层的局部变量,即需要修改外部函数的局部变量(访问无所谓) global 用来声明全局变量。
LEGB规则 python在查找“名称”时,按照locacl->enclosed->global->bulit in
def outer():
def inner():
print(str)
inner()
outer()
面向对象
class Student:
def __init__(self,name,score):
self.name = name
self.score = score
def say_score(self):
print("{0}的分数是:{1}".format(self.name,self.score))
s1 = Student("李四",99)
s1.say_score()
Student.say_score(s1)
print(dir(s1))
print(s1.__dir__())
print(isinstance(s1,Student))
类对象 类定义格式中,“class 类名:”。实际上,当解释器执行 class 语句时, 就会创建一个类对象。
class Student:
def __init__(self,name,score):
self.name = name
self.score = score
def say_score(self):
print("{0}的分数是{1}".format(self.name,self.score))
stu2 = Student
s1 = Student("张三",100)
s2 = stu2('王五',90)
s1.say_score()
s2.say_score()
实际上生成了一个变量名就是类名“Student”的对象。我们通过赋值给新变 量 Stu2,也能实现相关的调用。说明,确实创建了“类对象”。
类属性和类方法 类属性是从属于类对象的属性。可以被所有实例对象共享
class Student:
company = "abc"
count = 0
def __init__(self,name,score):
self.name = name
self.score = score
Student.count += 1
def say_score(self):
print("我的公司是:",Student.company)
print(self.name,'的分数是:',self.score)
s1 = Student("张三丰",88)
s1.say_score()
print('一共创建{0}个Student对象'.format(Student.count))
s2 = Student("李小龙",90)
s2.say_score()
print('一共创建{0}个Student对象'.format(Student.count))
执行结果: 我的公司是: abc 张三丰 的分数是: 88 一共创建1个Student对象 我的公司是: abc 李小龙 的分数是: 90 一共创建2个Student对象
类方法 类方法是从属于类对象的方法。通过装饰器@classmethod来定义 @classmethod def 类方法名 (cls[,形参列表]):#cls表示类对象,就像self,不能省 函数体
class Student:
company = "abc"
count = 0
@classmethod
def printCompany(cls):
print(cls.company)
def __init__(self,name,score):
self.name = name
self.score = score
Student.count += 1
def say_score(self):
print("我的公司是:",Student.company)
print(self.name,'的分数是:',self.score)
s1 = Student("杨",100)
s1.printCompany()
s2 = Student("赵",99)
s2.printCompany()
静态方法 定义与“类对象”无关的方法,称为“静态方法”。 静态方法中访问实例属性和实例方法会导致错误
__del__方法称为“析构方法”,用于实现对象被销毁时所需的操作。比如:释放对象 占用的资源,例如:打开的文件资源、网络连接等。
** _call_方法和可调用对象** 定义了_call_方法的对象,成为“可调用对象”。即该对象可以像函数一样调用。
class SalaryAccount:
def __call__(self, salary):
print("算工资啦。。。")
yearSalary = 12*salary
daySalary = salary//22.5
hourSalary = daySalary//8
return dict(yearSalary=yearSalary,monthSalary=salary,daySalary=daySalary, hourSalary = hourSalary)
s = SalaryAccount()
print(s(30000))
算工资啦。。。 {‘yearSalary’: 360000, ‘monthSalary’: 30000, ‘daySalary’: 1333.0, ‘hourSalary’: 166.0}
|