嵌套函数_nonlocal_LEGB_面向对象的编程

1430-王同学

发表文章数:21

热门标签

首页 » Python » 正文

1.嵌套函数(内部函数)

  • 在函数内部定义函数
  • 外部无法调用内部的函数
  • 降低重复代码
def outer():
    print("outer runing")

    def inner01():
        print("inner01 running")
    inner01()
outer()

def printName(isChinese,name,familyName):
    def inner_print(a,b):
        print("{0}{1}".format(a,b))
    if isChinese:
        inner_print(familyName,name)
    else:
        inner_print(name,familyName)
printName(True,'y','w')
printName(False,'Ivanka','Trump')
#运行结果
outer runing
inner01 running
wy
IvankaTrump

2.nonlocal_global

nonlocal:用来声明外层的局部变量

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()
print("a:",a)
#运行结果
inner: 10
outer b 20
a: 1000

3.LEGB规则

在查找一个“名称”时,按照LEGB规则查找
Local——Enclosed——Global——Build in
Local 函数或者类的方法内部
Enclosed 嵌套函数
Global 模块中的全局变量
Built in Python为自己保留的特殊名称

#str() step4
#str = 'global str' step3
def outer():
    #str = "outer" step2
    def inner():
        #str = 'inner' step1
        print(str)
    inner()
outer()

4.面向对象编程

Python是面向对象的语言,将数据和操作数据相关的方法封装到对象中,提高编程效率

  • 面向过程(小规模程序)
    通过过程组织程序,动词
  • 面向对象(大规模程序)
    通过对象组织程序,名词
    将不同类型的数据方法合在一起就是对象

4.1类的定义

类:将方法和属性放在一起
对象:方法(一样)+属性(一样)
一个类的实例

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("wy",90)
s1.say_score()

4.2构造函数

2个_init 2个_()方法用于初始化创建好的对象,给实例属性赋值
2个_new 2个_() 用于创建对象,但我们一般无需重新定义该方法
第一个参数必须为self

4.3实例属性

#接4.1代码
s1.age = 18
s1.salary = 3000
#del s1
print(s1.age)
print(s1.salary)

s2 = Student('wy',18)
s2.age=4
print(s2.age)
#运行结果
18
3000
4

4.4实例方法

从属于实例对象

def 方法名(self[,形参列表]):
		函数体
4.1代码
print(dir(s2)) #dir(obj)可以获得对象的所有属性、方法
print(s2.__dict__) #对象的属性字典
print(isinstance(s2,Student)) #判断对象是否属于类型的指定对象
class Man:
    pass
#运行结果
['__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__', 'name', 'say_score', 'score']
{'name': 'wy', 'score': 90}
True

4.5类对象

python中一切都是对象

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))

stu2 = Student
s1 = Student('wy','90')
s2 = stu2('wy',100)
s1.say_score()
s2.say_score()

4.6类属性和类方法

嵌套函数_nonlocal_LEGB_面向对象的编程

4.7类方法和静态方法

类方法:从属于类对象的方法,操作类属性

@classmethod
def 类方法名(cls[,形参列表]:
	函数体
class Student:
    company = 'SXT'

    @classmethod
    def printCompany(cls):
        print(cls.company)

Student.printCompany()

静态方法:定义与“类对象”无关的方法,通过类访问

@staticmethod
def 类方法名(cls[,形参列表]:
   函数体
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)
#运行结果
20+30=50

类方法和静态方法不能调用实例变量和方法

4.8__del__方法(析构函数)和垃圾回收机制

python实现自动的垃圾回收,当对象没有被引用时(引用计数为0),由垃圾回收器调用__del__方法

class Person:
    def __del__(self):
        print("销毁对象{0}".format(self))
p1 = Person()
p2 = Person()
del p2
print("程序结束")
#运行结果
销毁对象<__main__.Person object at 0x000001EDA003D370>
程序结束
销毁对象<__main__.Person object at 0x000001EDA003D220>

4.9__call__方法和可调用对象

可调用对象:该对象可以像函数一样被调用。

class SalaryAccount:
    '''工资计算'''
    def __call__(self, salary):
        print("算工资")
        yearSalsry = salary*12
        daySalary = salary//22.5
        hourSalary = daySalary//8

        return dict(yearSalsry=yearSalsry,mothsalary=salary,daySalary=daySalary,hourSalary=hourSalary)

s = SalaryAccount()
print(s(30000))
#运行结果
算工资
{'yearSalsry': 360000, 'mothsalary': 30000, 'daySalary': 1333.0, 'hourSalary': 166.0}
标签:

未经允许不得转载:作者:1430-王同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《嵌套函数_nonlocal_LEGB_面向对象的编程》 发布于2020-11-25

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录