nonlocal 关键字
nonlocal 用来声明外层的局部变量
global 用来声明全局变量
nonlcoal是针对于内部函数的,是在外部函数定义,内部函数可以使用的变量。
例
def outer_fuction()
d=10
def inner_fuction
nonlocal d#这样就可以使用外部函数的变量
a=d+1
LEGB规则
python在查找“名称”时,是按照LEGB规则进行查找。
L:local函数或者类的方法内部
E:Enclosed嵌套函数
G:Global模块中的全局变量
B:Built inPython 为自己保留的特殊名称
python会按照这个顺序查找,如果没有对应的名字就会报错。对于同一个名字,多次在不同位置赋值的时候,就可以根据这个顺序推断出输出。
面向对象
python可以面向过程、面向对象、函数式编程等多种编程范式。
面向对象编程是将数据和操作数据相关的方法封装到对象中,组织代码和数据的方式更加接近人的思维,从而大大提高编程效率。
面向过程适合小程序,是逻辑流程;面向对象适合复杂的程序,是一个设计思维。
类的定义
对象是通过类产生的。
一个类结构中包含方法(函数)即行为、属性(变量)即状态。
一个对象结构包含方法(由同一个类创建的所有对象共享)即行为、属性(每个对象维持自己的属性)即状态。
定义类的语法格式如下
class 类名
类体
1.类名必须符合标识符的命名规则;一般规定首写字母大写,多个单词使用驼峰原则。
2.类体中我们可以定义属性和方法。
3.属性用来描述数据,方法(即函数)用来描述这些数据相关的操作。
python中属性需要定义到特殊的方法中 def init(self):
例子:
class MyMessage:
def __init__(self,name,age,type):#self必须位于第一个参数
self.name=name
self.age=age
self.type=type
def temmie_introduce(self):#self必须
print('这是{1}岁的{2},它叫{0}'.format(self.name,self.age,self.type))
a=MyMessage('temmie',18,'dog')
a.temmie_introduce()
老单身狗了。
下面调用的第一句话:a=MyMessage(‘temmie’,18,‘dog’)就是调用了类名的构造方法。上面属性中的self就指创建的对象本身。
init()构造函数
这是构造函数的指定写法。
第一个参数必须为self。写法参考上面的格式即可。
实例属性
实例属性从属于实例独享的属性,也称为实例变量。
1.实例属性一般在__init__()方法中通过下面代码定义:
self.实例属性名=初始值
2.在本例的其他实例方法中,也可以通过self进行访问:
self.实例属性名
3.创建实例对象后,通过实例对象访问:
obj01=类名()#创建对象,调用__init__()初始化属性
obj.实例属性名=值#可以给已有属性赋值,也可以新加属性。
实例方法
实例方法是从属于实例对象的方法。
实例方法的格式:
def 方法名(self,[参数列表]):
函数体
调用:
对象.方法名([实例列表])
定义实例时,第一个参数必须是self;调用时不需要给self传参。
函数和方法的区别:1.都是用来完成一个功能的语句块,本质一样。2.方法调用上,通过对象来调用。方法从属于特定实例对象,普通函数没有这个特点。3.直观上,方法定义需要传递self,函数不需要。
其他的操作
语法 | 功能 |
---|---|
dir(obj) | 获得对象的所有属性、方法 |
obj.dict | 对象的属性字典 |
pass | 空语句 |
isinstance(对象,类型) | panduan “对象"是不是"指定类型” |
isinstance(a1,MyMessage)#判断a1是否是MyMessage类型
类对象
似乎要表达的意思就是创建的类就是一个模子,你可以重新给这个模子起名,然后用新名字来调用它。
也就是说:你定义了一个MyMessage的类,可以通过m=MyMessage,然后调用时写a=m.函数名 来使用。
类属性
与实例属性和实例方法类似,不过类属性和类方法属于类的。它可以被所有实例对象共享。
类方法
从属于类的方法。
类方法通过装饰器@classmethod来定义,必须位于方法上面一行。
@classmethod
def 类方法名(cls ,[参数列表]):#这里的cla默认固定即可
函数体
调用类方法格式:
类名.类方法名(参数列表)#这里面不需要给cls的值
类方法中访问实例属性和实例方法会报错
子类继承父类方法时,传入cs是子类对象,而非父类对象
静态方法
python中允许定义与‘类对象’无关的方法,称为静态方法。
静态方法通过装饰器@staticmethod来定义:
@staticmethod
def 静态方法名(参数列表):
函数体
静态方法访问实例对象和实例方法会报错。
总览
import time
class MyMessage:
lp='China'
num=0
@classmethod
def ans(cls):
print('共收到{0}条消息'.format(MyMessage.num))
@staticmethod
def time_ans():
print(time.time())
def __init__(self,name,age,type):#self必须位于第一个参数
self.name=name
self.age=age
self.type=type
MyMessage.num=self.num+1
def introduce(self):#self必须
print('第{3}名是来自{4}的{1}岁的{2},它叫{0}'.format(self.name,self.age,self.type,self.num,self.lp))
m=MyMessage
a=m('temmie',18,'dog')
a.introduce()
b=m('temmie',23,'single_dog')
b.introduce()
MyMessage.time_ans()
MyMessage.ans()
__del__析构函数
用于实现对象被销毁时所需的操作,关闭文件、关闭连接等。
python有自动垃圾回收机制,当对象没有被引用时(引用计数为0),由垃圾回收期调用__del__方法。我们也可以通过del语句删除对象来调用__del__方法。
__call__方法和调用对象
实现对对象像函数一样调用。
我目前的理解就是当做一个实例方法处理就可以了,写全了就是:a.call(),不过.__call__可省略,于是a()就可以表示这个方法了。
例:
class TemmieCount:
l='temmie_count'
num=0
def __call__(self):
print('temmie')
an=('{3} 收到了!!第{2}条记录 顾客:{0} 号码:{1}'.format(self.name,self.number,TemmieCount.num,TemmieCount.l))
return an
def __init__(self,name,number):
self.name=name
self.number=number
TemmieCount.num=TemmieCount.num+1
def temmie_call(self):
print('temmie!temmie!!temmie!!!')
a=TemmieCount('temmie1024',1024)
print(a.__call__())