五大内容:
1、 命名空间的理解
2、 类的特征装饰器
3、 自定义的异常类型
4、 类的名称修饰
5、 Python最小空类
一、命名空间的理解:
命名空间Namespace:从名字到对象的一种映射
1、 作用域:全局变量名在模块命名空间,局部变量名在函数命名空间
2、 属性和方法在类命名空间,名字全称:<命名空间>.<变量/函数名>
3、 命名空间底层由一个dict实现,变量名是键,变量引用的对象是值
例子:
比如复数z,z.real和z.imag是对象z命名空间的两个属性;对象d,d.name和d.printName()是对象d命名空间的属性和方法;global和nonlocal是两个声明命名空间的保留字。
代码例子:
count = 0
def get_c(a):
count = 0
if a!="":
def do_():
nonlocal count
count += 1
do_()
return count
print(get_c("1"),count)
print(get_c("2"),count)
print(get_c("3"),count)
结果:
表明nonlocal声明变量不在当前命名空间,变量在上层命名空间,而不是全局。
count = 0
def get_c(a):
count = 0
if a!="":
def do_():
count += 1
do_()
return count
print(get_c("1"),count)
print(get_c("2"),count)
print(get_c("3"),count)
若不声明count是否是全局变量或者局部变量则报错:
UnboundLocalError: local variable ‘count’ referenced before assignment
在函数外部已经定义了变量count,在函数内部对该变量进行运算,运行时会遇到了这样的错误:
主要是因为没有让解释器清楚变量是全局变量还是局部变量。
count = 0
def get_c(a):
count = 0
if a!="":
def do_():
global count
count += 1
do_()
return count
print(get_c("1"),count)
print(get_c("2"),count)
print(get_c("3"),count)
结果:
当增加全局变量声明时,每次都修改最外层count,即全局count,而函数中的count并未改变!
二、 类的特征装饰器
@property:类的特征装饰器
1、 使用@property把类中的方法变成对外可见的“属性”
2、 类内部:表现为方法
3、 类外部:表现为属性
他不是一个属性而是方法,但在外面访问时向属性一样。
目的:一方面这样操作/查询对象的属性会方便很多,同时不需要用init构造函数一次性初始化属性。
例子:
@property用于转换方法为属性
@<方法名>.setter 用于设定属性的赋值操作
class DE():
def __init__(self,name):
self.name = name
@property
def age(self):
return self._age
@age.setter
def age(self,value):
if value<0:
value = 30
self._age = value
dc =
DE("tub")
dc.age = -100
print(dc.age)
三、自定义的异常类型
异常Exception也是一种python类
1、 try-except捕捉自定义的异常
2、 继承Exception类,可以给出自定义的异常类
3、 自定义异常类是类继承的正常应用过程
例子:
代码中,e是一个异常对象,e是DemoException类生成的具体对象,是由实例化的过程来进行赋值的
class
DeomoException(Exception):
def __init__(self,name,msg = "自定义异常"):
self.name = name
self.msg = msg
try:
raise DeomoException("脚本错误")
except
DeomoException as e:
print("{}异常的报警是{}".format(e.name,e.msg))
结果:
脚本错误异常的报警是自定义异常
四、类的名称修饰
采用下划线进行名称修饰:
1、_X:单下划线开头的名称修饰:单下划线开头属性或方法为类内部使用 PEP8;只是约定,仍然可以通过<对象名>.<属性名>访问;功能:from XX import*时不会导入单下划线开头的属性或方法。
2、X_:单下划线结尾的名称修饰:单下划线结尾属性或方法为避免与保留字或已有命名冲突 PEP8;只是一个约定,无功能性对应。
3、__X:双下划线开头的名称修饰:双下划线开头的属性或方法将被解释器修改名称,避免命名冲突;不是约定,而是功能性,实现私有属性、私有方法,只是实现而已,python没有私有属性和方法;__X会被修改:_<类命>__X。
4、__X__:双下划线开头和结尾的名称修饰:没有任何特殊,普通名称,当然部分保留属性和保留方法是这样的名称。
5、_:无特殊功能,不重要的命名
总结有功能的
只有:_X 和 __X
五、 python的最小空类
class <类命>():
pass
作用:
1、 类是一个命名空间,最小空类可以当作命名空间使用
2、 最小空类可以辅助数据存储和使用
3、 动态增加属性是python类的一个特点,不止最小空类哦,所有类都可以。
例子:
可以实现对数据的保存,管理和存储数据的新方法
class empty_():
pass
a = empty_()
a.name ="tub"
a.age = 18
a.family =
{"lover":"dog","lover_2":"cat"}
print(a.family)
print(a.__dict__)
结果: