文章目录
- 嵌套函数(内部函数)
- 类
嵌套函数(内部函数)
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使用变量时的一种优先级顺序,排位越靠前,优先级越高:
- L----->Local (函数内部)
- E----->Enclosing (嵌套函数的外层函数内部)
- G----->Global (模板全局)
- 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对象包括:
- id
- type
- 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)