文章目录

  • 嵌套函数(内部函数)


嵌套函数(内部函数)

1、内部函数只能在外部函数进行调用,如果在外部函数外调用,则报错。

# 内部函数
def outer():
    s = 'this is outer'
    def inner():
        s1 = 'this is inner'
        print(s1)
    print(s)
    inner()

outer()  # this is outer   this is inner 
inner()  #报错

2、构造函数__init__()与析构函数__del()__
函数 _new()_:用于创建对象,但一般无需重定义该方法
函数_init()_:用于初始化创建好的对象。
只要是类里面的方法,self参数必须放第一个参数位置。

del函数:该函数用于对象被销毁时所需要的操作。比如:释放对象占用的资源。Python实现自动回收无用对象,所以该函数一般不需要自定义。

3、 函数__call__()
可以用实例对象直接调用的。比如:

class SalaryAccount:
    """工资计算类"""
    def __call__(self,salary):
        yearSalary = salary*12
        daySalary = salary//27.5
        monthSalary = salary
        return dict(yearSalary = yearSalary,daySalary = daySalary,monthSalary = monthSalary)
    
s = SalaryAccount()
print(s(3000))

4、 nonlocal与global

nonlocal是内部函数使用外部函数的变量时的一种说明方法,就像函数想使用全局变量要用global关键字进行声明一样。

def f():
    a = 90
    def inner():
        nonlocal a
        print(a)
        a=10
    inner()
    print(a)
f()

5、 LEGB规则
该规则是Python使用变量时的一种优先级顺序,排位越靠前,优先级越高:

  1. L----->Local (函数内部)
  2. E----->Enclosing (嵌套函数的外层函数内部)
  3. G----->Global (模板全局)
  4. B----->Built-in (python关键字)

函数在使用变量的时候,遵守该规则。

str = '123'
def outer():
    str = 'outer'
    def inner():
        str='inner'
        print(str,end=',')
    print(str,end=',')
    inner()
outer()
print(str)    # inner,outer,123

6、面向对象与面向过程的区别
最经典的例子是:大象进冰箱。
以下是我从百度得到的面向对象:
“面向对象(Object Oriented)是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。
面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。”
说白了就是完成一系列过程所需要的步骤(即:怎么设计这个事物),而不需要去考虑每个步骤内部具体的实现。

1、类包括方法和属性。类的通用语法格式:

class 类名:
    #类的内部

实例:

class MyStudent: # 类名一般首字符大写,多个单词驼峰原则
    def __init__(self,name,score):    # 构造方法 ,需要写的
        self.name = name
        self.score = score
    def say_score(self):
        print('{0}的分数是{1}'.format(self.name,self.score))
s1 = MyStudent('XiaoMing',99)  #自动调用构造方法 __init__(self,name,score)
s1.say_score()    
'''
.是用于调用类里面的方法
输出结果:
 XiaoMing的分数是99
 '''

一个python对象包括:

  1. id
  2. type
  3. value (1) 属性 (2)方法
    事实上,python在内存中放置好了类,然后如果创建该类对象,那么这个对象所在的内存块内部就存放了类的方法、属性,但是如果给一个对象增加属性,那么这个属性是在类中所不存在的,具体如下:
class MyStudent: # 类名一般首字符大写,多个单词驼峰原则
    def __init__(self,name,score):    # 构造方法,self表示当前对象本身
        self.name = name
        self.score = score
    def say_score(self):
        print('{0}的分数是{1}'.format(self.name,self.score))
s1 = MyStudent('XiaoMing',99)
s1.say_score()

s1.age = 10  # 通过对象增加的,但是在类中并没有
print(s1.age)
s2 = MyStudent('1',90) # s2中就没有age这个属性

2、类对象和实例对象
当我们定义了一个类以后,该类的类名即为类对象。实例对象就是将类实例化的对象。

class Student:
    pass
print(type(Student))  # <class 'type'>   可以看出来,Student就是一个类型,我们把这种类型称为类对象

将类实例化后传给的对象成为实例对象

class Student:
    def __init__(self,name,score):
        self.name = name
        self.score = score
stu1 = Student('XiaoMing',100) # stu1就是实例对象

3、类属性与类方法
类属性:类属性是从属于类对象的属性。

class Student:
    count = 0    # 类属性
    classes = 'No.1'
    def __init__(self,name,score):
        self.name = name  # 实例属性
        self.score = score
    def PrintInfo(self,name):
        print(name,'is in class',Student.classes) # classes是从属于类对象的属性

类方法:类方式是从属于“类对象”的方法。类方法通过装饰器@classmethod来定义,格式如下:

@classmethod
def 类名(cls,……,):
    函数体

其中,cls必须有,因为cls指的就是“类对象本身。注意:在类方法中无法访问实例方法和实例对象
静态方法:与普通函数没有区别,只不过该函数放在了类内部,实际上通过类名就能进行调用。

@staticmethod
def 静态方法名:
    函数体

实例::

class Student:
    @staticmethod
    def add(a,b):
        print("{0} + {1} = {2}".format(a,b,(a+b)))
Student.add(90,80)