一、什么是面向对象
1.1 面向过程编程思想
1.2 面向对象编程思想
二、如何产生对象
2.1 什么是类
2.2 如何定义类
2.2.1 函数的名称空间和类的名称空间的区别
三、什么是对象
2.3 类的操作
四、类和对象的操作:增、删、查、改
4.1 查看类和对象的名称空间
4.2 类和对象的属性(类中的变量)操作
4.2.1 查找类和对象的属性
4.2.2 增加类和对象中的属性
4.2.3 修改类和对象中的属性
4.2.4 删除类和对象中的属性
五、类中的数据属性(类中的变量)
六、类中的方法(类中的函数)
七、对象属性的查找顺序
八、对象绑定方法的特殊之处
九、一切皆对象
面向对象
一、什么是面向对象
注意:编程思想仅仅是一门思想,与任何技术无关。
注意:编程思想仅仅是一门思想,与任何技术无关。
面向对象是一门编程思想
1.1 面向过程编程思想
核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么
基于该编程思想编写程序,就好比在设计一条工厂流水线,一种机械式的思维方式。
- 优点
- 将复杂的问题流程化,进而简单化
- 缺点
- 牵一发而动全身,程序的可扩展性差
1.2 面向对象编程思想
核心是对象二字,对象指的是特征与技能的结合体。
基于该编程思想编写程序,就好比在创造世界,一种上帝式的思维方式。
- 优点
- 可扩展性高
- 缺点
- 编写程序的复杂程度比面向过程高
二、如何产生对象
产生对象前需要先了解什么是类
2.1 什么是类
类指的是类型、类别,是面向对象分析和设计的基石
- 在两种角度去看待
- 现实世界中
- 先有一个个对象,经过社会的文明发展,产生抽象的类
- 在程序中
- 必须先有类,再通过调用类,产生对象

对象是用来存放数据与功能的容器
那么类则是用来存放多个对象相同的数据与功能的容器
2.2 如何定义类
面向对象的基本思路就是把程序中要用的、相关联度的数据与功能整合到对象里,然后再去使用,例如:学生,老师,课程等,显而易见的是:学生有学生相关的数据与功能,老师有老师相关的数据与功能,以学生为例:
# 学生的数据有 学校 名字 年龄 性别 # 学生的功能 选课
详细的
# 学生1
数据:
学校=清华大学
姓名=张三
性别=男
年龄=28
功能:
选课
# 学生2
数据:
学校=清华大学
姓名=韩梅梅
性别=女
年龄=18
功能:
选课
# 学生3
数据:
学校=清华大学
姓名=李四
性别=男
年龄=25
功能:
选课我们可以总结出一个学生类,用来存放学生们相同的数据与功能
# 学生类
相同特征:
学校=清华大学
相同功能:
选课基于上述分析的结果,我们接下来需要做的就是在程序中定义出类,然后调用类产生对象
class Student: # 类的命名应该使用“驼峰体”
school='清华大学' # 数据
def choose(self): # 功能
# 注意:在类内部定义函数,会默认有一个参数self
print('%s is choosing a course' %self.name)
def func():# 函数名指向的是函数的内存地址
class Student:# 类名指向的是类的内存空间
2.2.1 函数的名称空间和类的名称空间的区别
- 函数的名称空间
- 在调用函数时产生,函数调用结束后销毁
- 类的名称空间
- 在定义阶段时产生,会将类中所有的名字,扔进类的名称空间
三、什么是对象
- 调用类拿到的返回值就是程序中的对象,或者称之为类的实例化
- 对象是用来存放数据与功能的容器
- 不同的对象虽然调用的是同一个类,但是每个对象中的内存地址是不一样的的,但类的数据是一样的
# 定义类
calss People:
country = 'China'
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
def learn(self):
print('learnin....')
# 调用类
People() # 调用类的方法:类名+()
# 调用类返回的值就是对象
p_obj = People() # 此时p_obj就是对象2.3 类的操作
类的实例化:调用类的过程称之为类的实例化,产生的对象也可以称之为类的一个实例。
调用类产生对象发生的事情:
1、会产生一个空对象的名称空间 2、会自动触发`__init__`,并且会将对象当做第一个参数传入 3、会将调用类括号内的参数一并传给`__init__()`
calss People:
country = 'China'
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
def learn(self):
print('learnin....')四、类和对象的操作:增、删、查、改
4.1 查看类和对象的名称空间
类.__dict__ 对象.__dict__
class People:
country = 'China'
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
def learn(self):
print('learning.....')查看类的名称空间
print(People.__dict__)
{'__module__': '__main__', 'country': 'China', '__init__': <function People.__init__ at 0x00000257B37E3D38>, 'learn': <function People.learn at 0x00000257B37E3318>, '__dict__': <attribute '__dict__' of 'People' objects>, '__weakref__': <attribute '__weakref__' of 'People' objects>, '__doc__': None}
# 可以看到返回类的名称空间中包含我们定义的country,init,learn等查看对象的名称空间
p1 = People('tank', 16, 'male')
print(p1.__dict__)
{'name': 'tank', 'age': 16, 'sex': 'male'}4.2 类和对象的属性(类中的变量)操作
4.2.1 查找类和对象的属性
# 查找类的属性
print(People.country)
China
# 查找对象的属性
p1 = People('tank', 16, 'male')
print(p1.name)
tank4.2.2 增加类和对象中的属性
# 增加类的属性
People.number = 100000
print(People.number)
100000
# 增加对象中的属性
p1 = People('tank', 16, 'male')
p1.sal = 8000
print(p1.sal)
80004.2.3 修改类和对象中的属性
# 修改类的属性
People.country = '中国'
print(People.country)
中国
# 修改对象的属性
p1 = People('tank', 16, 'male')
p1.name = 'sean'
print(p1.name, p1.age, p1.sex)
sean 16 male4.2.4 删除类和对象中的属性
# 删除类的属性
del People.country
print(People.country)
AttributeError: type object 'People' has no attribute 'country'
# 删除对象的属性
p1 = People('tank', 16, 'male')
del p1.name
print(p1.name, p1.age, p1.sex)
AttributeError: 'People' object has no attribute 'name'五、类中的数据属性(类中的变量)
类中的属性是给对象使用的
p_obj1 = People('tank', 17, 'male')
p_obj2 = People('jason', 71, 'female')
p_obj3 = People('大饼', 72, 'female')
print(p_obj1)
print(p_obj2)
print(p_obj3)
<__main__.People object at 0x0000025FBA358C48>
<__main__.People object at 0x0000025FBA358C88>
<__main__.People object at 0x0000025FBA358CC8>
# 注意:不同的对象,内存地址是不一样的对象引用类中的属性,指向的都是类中同一个内存地址
print(p_obj1.country, id(p_obj1.country)) print(p_obj2.country, id(p_obj2.country)) print(p_obj3.country, id(p_obj3.country)) China 1551817278384 China 1551817278384 China 1551817278384
六、类中的方法(类中的函数)
类中方法是给对象使用的
由不同的对象来调用就会将方法绑定给不同的对象,并且会将对象当做第一个参数传入。
print(People) print(p_obj1.learn, id(p_obj1.learn)) print(p_obj2.learn, id(p_obj2.learn)) print(p_obj3.learn, id(p_obj3.learn)) <class '__main__.People'> <bound method People.learn of <__main__.People object at 0x0000020FC47F8C88>> 2266592990536 <bound method People.learn of <__main__.People object at 0x0000020FC47F8CC8>> 2266592990536 <bound method People.learn of <__main__.People object at 0x0000020FC47F8D08>> 2266592990536

每个不同对象调用类中方法的时候,每个对象指向的内存ID不一样,pycharm中有优化机制,所以相同
七、对象属性的查找顺序
先从对象自己名称空间中查找 ---> 类的名称空间 
八、对象绑定方法的特殊之处
- 会将对象当做第一个参数传入
- 若对象的绑定方法中还有其他参数,会一并传入
calss People:
country = 'China'
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
def learn(self): # 在类中就是方法(类中的函数)
print('learnin....')
p_obj1 = People()
p_obj.learn() # 对象绑方法就是对象调用类中的函数九、一切皆对象
在python3中,类即类型。
print(type(str1)) <class 'str'> l1 = [1, 2, 3] print(l1) <class 'list'>