五大内容:

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)

结果:

python 类中给属性起别名_python

表明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)

结果:

python 类中给属性起别名_类_02

当增加全局变量声明时,每次都修改最外层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__)

结果:

python 类中给属性起别名_python 类中给属性起别名_03