静态属性的陷阱 python中类与对象的命名空间、__dict__ 和 dir 在继承中使用说明

1. 面向对象的概念1)类是一类抽象的事物,对象是一个具体的事物;用类创建对象的过程,称为实例化 。
2)类就是一个模子,只知道在这个模子里有什么属性、什么方法,但是不知道这些属性、方法具体是什么;
所以,我们要在这个模子的基础上 造出一个具体的实例(对象),这个实例就会具体化属性、方法
3)所有的数据类型都是类,都是抽象的;根据数据类型定义变量,该变量就是一个具体的值(对象) 。
面向过程 --> 面向对象的转变
定义一个函数   《==》 定义一个类
函数的返回值(字典)   《==》类的对象(类似字典,只不过调用方式发生了改变)
函数的执行过程 《==》类的实例化
请看 代码展示1 和 代码展示2
 1 # 用面向对象的思想、面向过程的语法 去实现 Rectangle的计算 2 def Rectangle(length=0, width=0): 3     self = {}  # 存储属性值 4     def __init__(*args):  # 初始化函数 -- 完成对矩阵rectangle的长、宽初始化,以及面积、周长的调用方式 5         self['length'] = args[0] 6         self['width'] = args[1] 7         self['area'] = area 8         self['perimeter'] = perimeter 9     def area():10         return self['length'] * self['width']11     def perimeter():12         return 2 * (self['length'] + self['width'])13     __init__(length, width)  # 调用初始化函数14     return self1516 rec_obj = Rectangle(10,5)   # rec_obj 相当于类的一个实例17 print(rec_obj)      # rec_obj中存放了实例的属性、方法,通过实例可以查看属性 与 调用方法18 print('length:%s, width:%s, area:%s, perimeter:%s'\19       %(rec_obj['length'], rec_obj['width'], rec_obj['area'](), rec_obj['perimeter']()))代码展示1
 1 class Rectangle: 2     temVar = 'over' #定义静态属性,共享于类中的每个对象 3     def __init__(self, *args):  # 创建对象后执行的第一个函数,self就是类创建的对象,该函数返回类的对象self 4         self.length = args[0] 5         self.width = args[1] 6     def area(self): 7         return self.length * self.width 8     def perimeter(self): 9         return 2 * (self.length + self.width)1011 rec_obj1 = Rectangle(10, 5) # 实例化一个具体对象1213 # 通过 对象 查看属性(包括静态属性)与调用方法14 print('length:%s, width:%s, area:%s, perimeter:%s'\15       %(rec_obj1.length, rec_obj1.width, rec_obj1.area(), rec_obj1.perimeter()))16 print(rec_obj1.temVar)  # 静态属性1718 # 通过 类名 调用方法 、类中的静态属性19 print('area:%s, perimeter:%s'%( Rectangle.area(rec_obj1), Rectangle.perimeter(rec_obj1)))20 print(Rectangle.temVar)  # 静态属性2122 # 通过对象名修改属性(若self里 存在该属性,是修改;若self里 不存在该属性,是添加新属性)23 # rec_obj1.length = 2024 # rec_obj1.temVar = 'object_over'  # 给对象中添加一个新属性 'temVar': 'object_over'25 # 通过类名修改属性(若类里 存在该属性<静态属性>,是修改;若类里 不存在该属性,是添加新属性,<静态属性>)26 # Rectangle.length = 50   # 在类中添加一个新属性 'length': 5027 # Rectangle.temVar = 'class_over'2829 # __dict__的使用30 print(rec_obj1.__dict__)    # 查看对象的所有属性,即self属性31 print(Rectangle.__dict__)   # 查看类的所有静态属性、方法32 # __dict__ 对于 对象的 增删改查操作都可以通过字典的语法进行33 # __dict__ 对于 类中的名字只能看 不能操作

经验总结扩展阅读