面向过程编程vs函数式编程
# 面向过程编程 测量对象的元素个个数。
s1 = 'fjdsklafsjda'
count = 0
for i in s1:
count += 1
l1 = [1,2,3,4]
count = 0
for i in l1:
count += 1
def func(s):
count = 0
for i in s:
count += 1
return count
func('fdsafdsa')
func([1,2,3,4])
函数式编程
通过对比可知:函数编程较之面向过程编程最明显的两个特点:
1,减少代码的重用性。
2,增强代码的可读性。
类与对象
在现实世界中:先有对象,再有类
在程序中:务必保证先定义类,后产生对象
属性 ,方法 ≈ 变量(数据),函数(功能)
**面向过程:**
面向过程核心是过程二字,过程就是先干什么,在干什么,最后干什么
过程的终极奥义就是将程序流程化
过程是"流水线",用来分步骤解决问题的
优点:复杂的问题简单化,进而流程化
缺点:扩展性差,可维护性差
应用场景:应用在扩展性要求不高的地方, eg:安装包的使用
**面向对象:**
核心是"对象"二字
对象的终极奥义就是将程序"整合"
对象是"容器",用来盛放数据与功能的
优点:
扩展性强,可维护性强
缺点:
编程复杂度高
应用场景:用在扩展性要求高的地方, eg:微信,qq
程序=数据+功能
类也是"容器",该容器用来存放同类对象共有的数据与功能
写程序前:先思考哪些数据与功能可以整合到一起————————>对象
先定义类,在调用类产生对象
调用类的过程又称之为实例化,发生了三件事
1、先产生一个空对象
2、python会自动调用类中的__init_.方法然将空对象已经调用类时括号内传入的参数一同传给__init__方法
3、返回初始完的对象
**定制对象自己独有的属性和方法
class Student():
# 定义属性
school = 'SH'
# 当调用类的时候,会自动调用的函数, 初始化方法 (********)
# def __init__(stu_obj, name, age, gender):
# # stu_obj => stu1
# stu_obj.name = name # stu1.__dict__['name'] = 'egon'
# stu_obj.age = age, # stu1.__dict__['age'] = 18
# stu_obj.gender = gender # stu1.__dict__['gender'] = 'male'
def choose_course(stu_dic, course):
stu_dic['courses'].append(course)
print("%s选课成功 %s" % (stu_dic['name'], stu_dic['courses']))
stu=Student()
print(stu.__dict__)
# 调用类
"""
调用类发生什么事?
1. 会自定触发__init__方法
2. 把对象本身当成第一个参数自动传递给了__init__方法
"""
# stu1 = Student('egon', 18, 'male') # Student(stu1, 'egon', 18, 'male')
# stu2 = Student('egon1', 18, 'male') # Student(stu2, 'egon', 18, 'male')
# stu2 = Student()
# stu3 = Student()
stu2 = Student()
stu1 = Student()
属性的查找
class Student():
# 定义属性
school = 'SH'
# country = 'Chinese'
# 当调用类的时候,会自动调用的函数, 初始化方法 (********)
def __init__(stu_obj, name, age, gender, courese=None):
# stu_obj => stu1
if courese is None:
courese = []
stu_obj.name = name # stu1.__dict__['name'] = 'egon'
stu_obj.age = age, # stu1.__dict__['age'] = 18
stu_obj.gender = gender # stu1.__dict__['gender'] = 'male'
stu_obj.courese = courese # stu1.__dict__['gender'] = 'male'
def choose_course(stu_obj, course):
# stu_obj => stu
# stu_dic['courses'].append(course)
stu_obj.courese.append(course)
"""
stu_obj = {'name': 'egon', 'age': (18,), 'gender': 'male', 'courese': []}
"""
print("%s选课成功 %s" % (stu_obj.name, stu_obj.courese))
stu = Student('egon', 18, 'male')
stu1 = Student('egon1', 18, 'male')
# print(stu.__dict__)
# 类属性的查找
# print(Student.__dict__['school'])
# 查
# print(Student.school)
# 增加
# Student.country = 'Chinese'
# 修改
# Student.school = 'BJ'
# 删除
# del Student.school
# Student.choose_course(stu, 'python')
# Student.choose_course(stu1, 'linux')
# print(Student.choose_course)
# print(Student.__dict__)
# 对象的属性查找
# print(stu.__dict__)
# print(stu.name)
# print(stu.age)
# print(stu.gender)
#
# stu.name = 'xxx'
# print(stu.name)
# print(stu.__dict__)
# stu.school = 'xxxxxxx'
# print(stu.__dict__)
# print(stu.school)
# 类中的方法类可以调用,但是推荐对象来调用,对象来调用,把对象本身当成第一个参数传递给函数的第一个参数
stu.choose_course('python') # stu.choose_course(stu, 'python')
stu1.choose_course('linux') # stu.choose_course(stu, 'python')
总结__init__方法
1、会在调用类时自动触发执行,用来为对象初始化自己独有的数据
2、init__内应该存放是为对象初始化属性的功能,但是是可以存放任意其他代码,想要在
类调用时就立刻执行的代码都可以放到该方法内
3、-_init__方法必须返回None