面向对象
一、什么是面向对象
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 删除类和对象中的属性
五、类中的数据属性(类中的变量)
六、类中的方法(类中的函数)
七、对象属性的查找顺序
八、对象绑定方法的特殊之处
九、一切皆对象
TOC
一、什么是面向对象
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__': , 'learn': , '__dict__': , '__weakref__': , '__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))
> 2266592990536
> 2266592990536
> 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))
l1 = [1, 2, 3]
print(l1)
来自为知笔记(Wiz)