# -*- coding: utf-8 -*-
# @Time    : 2020/02/11 14:49
# @Author  : xianming yu
# @File    : 13类属性_创建对象的过程以及实例的概念.py

"""
类属性_创建对象的过程以及实例的概念
"""
"""
i1 术语
    1.使用面向对象开发,"第一步"是设计类
    2.使用类名(),创建对象,创建对象的动作有两步
        2.1 在内存中为对象,分配空间
        2.2 调用初始化方法__init__为对象初始化
    3.对象创建后,内存中就有了一个对象的实实在在的存在--实例
        因此通常也会把:
            1.创建出来的"对象"叫做"类"的"实例"
            2.创建对象的"动作"叫做"实例化"
            3.对象的属性叫做"实例属性"
            4.对象调用的方法叫做"实例方法"
        在执行程序时
            1.对象各自拥有自己的"实例属性"
            2.调用对象方法,可以通过self.
                2.1 访问自己的属性
                2.2 调用自己的方法
i2 结论
    1.每一个对象都有自己独立的内存空间,保存各自不同的属性
    2.多个对象的方法,在内存中只有一份,在调用方法时,需要把对象的引用,传递到方法的内部
i3 类是一个特殊的对象
    python中一切皆对象:
        1.class AAA:定义的类属于"类对象"
        2.obj1=AAA()属于实例对象
    1.在程序运行时,"类"同样会被加载到内存
    2.在Python中,类是一个特殊特殊的对象--类对象
    3.在程序运行时,类对象在内存中只有一份,使用一个类可以创建出很多个"实例对象"
    4.除了封装实例的属性和方法外,类对象还可以拥有自己的属性和方法
        4.1 类属性
        4.2 类方法
        4.3 通过"类名."的方式可以访问"类的属性"或者"调用类的方法"
i4 类属性和实例属性
    1.概念和使用
        1.1 类属性就是给类对象定义的属性
        1.2 通常用来记录"与这个类相关的特征"
        1.3 类属性不会用于记录"具体对象的特征"
    2.实例需求
        2.1 定义一个工具类
        2.2 每件工具都有自己的name
        需求如下:
            知道使用工具类,创建了多少个工具对象?
        设计
            类设计
                类名
                     Tool #类名
                属性               
                    tool.count #类属性
                    name #实例属性
                方法
                    __init__(self,name) #初始化方法
            代码实现
                class Tools(object):
                    #使用赋值语句,定义类属性,记录创建工具对象的总数
                    count=0
                    def __init__(self,name):
                        self.name = name
                        #针对类属性做一个计数+1
                        Tools.count+=1
                #调用:创建对象
                    tools1 = Tools("斧头")
                    tools2 = Tools("榔头")
                    tools3 = Tools("刀子")
                    #知道使用 Tool 类到底创建了多少个对象?
                    print("现在创建了%d个工具"%Tools.count) #通过"类名.类属性"-来访问"类属性"
                输出结果:
                    现在创建了3个工具
i5 属性的获取机制(科普)
    1.在python中属性的获取存在一个向上查找机制
        例如:上面创建的工具类:Tools,我们除了可以用Tools.count来访问类属性以外,还可以使用
             实例化对象.count的方式来访问类属性,如:tools1.count,如果用tools1.count的
             方式访问类属性,那么它向上查找的机制是:
                首先在tools1这个对象的内部查找对象属性count,如果有count这个属性程序就直接返回,
                如果没有就会向上寻找"类属性",如果类中有count这个属性程序就直接返回,没有程序就会
                报错
    2.因此,要访问类属性有两种方式
        2.1 类名.类属性
        2.2 对象.类属性(不推荐)
        注意点:如果使用 对象.类属性=值 赋值语句,只会给对象添加一个属性,而不会影响到类属性的值,如下:
            tools1.count=90
"""
#类属性定义
class Tools(object):
    #使用赋值语句,定义类属性,记录创建工具对象的总数
    count=0
    def __init__(self,name):
        self.name = name
        #针对类属性做一个计数+1
        Tools.count+=1

tools1 = Tools("斧头")
tools1.count=30
tools2 = Tools("榔头")
tools3 = Tools("刀子")
print("现在创建了%d个工具"%Tools.count)
print("现在创建了%d个工具"%tools1.count)
