python命名空间、类的特征装饰器、类的名称修饰、最小空类、自定义的异常类型

五大内容:

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

结果:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值