一、“对象”与“类”
1、“程序”就是“数据”与“功能”。
2、面向对象编程思想的核心就是“对象”一词,“对象”的终极形态就是“程序”的“整合”。
3、基于“整合”的构想,“对象”就是用来盛放“数据”与“功能”的“容器”。
4、用来盛放“同类对象”的“共有数据”与“共有功能”的“容器”就是“类”。
二、“对象”与“类”的定义
1、先定义“类”:“类”是对象的“共有数据”与“共有功能”的集合体,所以“类”的定义大多就是“共用变量”与“共用函数”的定义,但是少数情况下,“类”体内也会包含其他代码。“类”体代码会在定义阶段直接执行,即“类”的定义阶段就产生了“类”的名称空间。
class Goods: # 创建名为 Goods 类,约定上用驼峰体 goods_maker = 'china' # 定义共用变量 def add_goods_info(goods_dict, new_name, new_price): # 定义共用功能 goods_dict['name'] = new_name goods_dict['price'] = new_price goods_info_1 = {} goods_info_1['goods_maker'] = Goods.goods_maker # 通过类名引用到共用变量的值 Goods.add_goods_info(goods_info_1, '小tank', 500) # 通过类名引用到共用函数的功能 print(goods_info_1) # 结果为 {'goods_maker': 'china', 'name': '小tank', 'price': 500}
2、再产生“对象”:又可以称为实例化,即“对象”就是“实例”。简单来讲,“类”是所有“对象”的统称,“对象”是“类”的具体表现。调用“类”就是在进行“对象”的实例化,这个过程发生了三件事。
①先产生“空对象”。
②自动执行“类”体内的__init__功能,把调用给的对象作为第一参数,把调用时填入的的参数依次作为后续参数。
③执行完即完成了“对象”的初始化。
④补充:__init__功能的作用就是初始化“对象”的属性,所以其内部应该存放对象相关代码,但是其本质上还是一个函数,也可以放入任何代码,这些额外的代码也可以在调用“类”的时候运行。
⑤注意:__init__功能不可以声明None以外的返回值,否则会报错。
class Goods: maker = 'china' def __init__(self, new_name, new_price): # 定义__init__的需要参数,即定义了对象的参数 self.name = new_name self.price = new_price goods_info_1 = Goods('小tank',500) # 调用类并传入对应参数 print(goods_info_1.__dict__) # 结果为 {'name': '小tank', 'price': 500}
三、“对象”与“类”的使用
1、引用变量:“类”把变量的内存地址通过变量名共享给了“对象”,所以“类”中的该变量名若被赋了新的变量值,即指向了新的内存地址的话,“所有对象”会随之变化。而反过来,“某个对象”用同样的变量名被赋了新的变量值,相当于在“这个对象”自己的名称空间中新建了一个名字,所以不会影响“类”和“其他对象”。
class Goods: maker = 'china' def __init__(self, new_name, new_price): self.name = new_name self.price = new_price goods_info_1 = Goods('小tank', 500) goods_info_2 = Goods('电饭锅', 20) Goods.maker = 'japan' print(Goods.maker, goods_info_1.maker, goods_info_2.maker) # 结果为 japan japan japan goods_info_1.maker = 'germany' print(Goods.maker, goods_info_1.maker, goods_info_2.maker) # 结果为 japan germany japan
2、引用函数:“类”把函数的功能通过函数名绑定给了“对象”,而非共享内存地址,“所有对象”指向的都是相同功能,但是绑定的结果又是“每个对象”所独有的不同内存地址的新功能。可以通过“类”调用函数,而通过“对象”调用函数时,类似于调用“类”产生“对象”的机制,会把“对象”自己作为首个参数传入。
class Teachers: def info(self, name, age, hobby): self.name = name self.age = age self.hobby = hobby p1 = Teachers() # 产生类的对象 p1 p2 = Teachers() # 产生类的对象 p2 p1.info('tank', '17', 'play') p2.info('egon', '18', 'dance') # 通过对象调用函数,把对象自己连同括号内的参数一并传入 print(p1.name) # 结果为 tank print(p2.name) # 结果为 egon