面向对象编程

面向过程编程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
上一篇:使用Lambda表达式 .groupingBy函数进行分组


下一篇:python系统学习【二】