一、什么是面向对象

'''
- 面向对象是一种编程思想
	- 注意:要站在全局的角度去设计
	核心是“对象”二字,对象是“特征与技能的结合体”,基于该编程思想编写程序,需要如上帝一样创造,抽象出一个个类
	- 优点:
		扩展性强
	- 缺点:
		编写程序的复杂度比面向过程更高
'''

二、如何产生对象

1、类和对象的关系

'''
现实生活中:先由一个个对象,总结出各对象之间的特征特点,抽象出一个类
编程过程中:先定义一个类,再由类实例化产生一个对象
- 对象指的是“特征与技能”的结合体
- 类指的是对象之间“特征与技能”的结合体
如 人类是一个抽象的类,而具体到某一个人,则就是人类实例化的对象。
'''

2、定义类的语法

class 类名:
	pass
# 注意:类名一般用驼峰命名法命名

三、类的实例化

'''
类的实例化:调用类的过程称之为类的实例化,产生的对象也可以称之为类的一个实例

调用类产生对象的过程:
	1、会产生一个空的对象的命名空间
	2、会自动触发__init__,并且会将对象当作第一个参数传入
	3、会将调用类括号内的参数一并传给__init__()
'''

四、查看类与对象的命名空间

# 类.__dict__
# 对象.__dict__

五、类或对象的属性操作

class People:
    country = 'China'
    def __init__(self, name, age, sex):
        print(self.__dict__)
        print(self)
        self.name = name
        self.age = age
        self.sex = sex
        print(self.__dict__)

    # 注意: 看到self就应该知道是对象本身
    def learn(self):
        print('learning....')

        
p_obj = People('yyh',18,'male')
'''
类和对象都可以直接通过直接访问的方式来对属性进行 查、增、删、改 的操作
'''
People.country
p_obj.country
p_obj.name

六、类中数据属性(类中的变量):类中属性是给对象使用的,对象引用类中的属性,指向的都是类的内存地址

# p_obj1 = People('tank', 17, 'male')
# p_obj2 = People('jason', 71, 'female')
# p_obj3 = People('大饼', 72, 'female')
# print(p_obj1.country, id(p_obj1.country))
# print(p_obj2.country, id(p_obj2.country))
# print(p_obj3.country, id(p_obj3.country))

七、类中的方法

# 类中的方法是给对象使用的
# 不同的对象调用方法就会将方法绑定给不同的对象,并且会将对象当作第一个参数传入,称为类的绑定方法
# print(People.learn)
# print(p_obj1.learn)  # bound method
# print(p_obj2.learn)
# print(p_obj3.learn)

八、对象属性的查找顺序

# 先从对象自己名称空间中查找,然后从类的名称空间中查找。
# 找不到则报错