一、“对象”与“类”

  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

 

posted on 2020-02-02 01:01  焚音留香  阅读(643)  评论(0编辑  收藏  举报