一、什么是面向对象
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) tank
4.2.2 增加类和对象中的属性
# 增加类的属性 People.number = 100000 print(People.number) 100000 # 增加对象中的属性 p1 = People('tank', 16, 'male') p1.sal = 8000 print(p1.sal) 8000
4.2.3 修改类和对象中的属性
# 修改类的属性 People.country = '中国' print(People.country) 中国 # 修改对象的属性 p1 = People('tank', 16, 'male') p1.name = 'sean' print(p1.name, p1.age, p1.sex) sean 16 male
4.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'>