36.Python封装对象推导

0.对比

互补:
面向过程的缺点就是面向对象的优点.
面向对象的缺点就是面向过程的优点.

1.面向过程的概念

核心:过程.
过程:解决问题的流程.

优点:复杂的问题流程化进而简单化.
一个复杂的问题,拆分成一个个的流程,分步完成.

缺点:牵一发动全身,扩展性差,可维护性差.

应用场景:对扩展性要求不高的地方.
逻辑不变的,固定死的代码.
"""
注册用户的功能
1.获取用户输入  用户名 和 密码
2.验证参数
3.写入文件,注册成功
"""


# 注册
def register():
    """
    :return: 字典 {
    'username': username,
    'password': password}
    """
    username = input('输入用户名称>>>:').strip()
    password = input('输入用户密码>>>:').strip()
    return {
        'username': username,
        'password': password
    }


# 账户密码验证
def check_info(userinfo):
    """

    :param userinfo: 字典 {需要有名称和密码}
    :return: is_valid 验证信息
    """
    is_valid = True
    if len(userinfo['username']) == 0:
        print('用户名称为空')

        is_valid = False

    if len(userinfo['username']) == 0:
        print('用户密码为空')

        is_valid = False

    return is_valid


# 写文件
def writer_file(userinfo, is_valid):
    """
    
    :param userinfo: 字典 {需要有名称和密码}
    :param is_valid: 验证后的信息
    :return: Tuer 或 False  True注册成功 False 注册失败
    """
    if is_valid:
        import json
        with open('%s.txt' % userinfo['username'], mode='w', encoding='utf8') as f1:
            json.dump(userinfo, f1)
            return True
    else:
        return False


# 主函数
def main():
    userinfo = register()
    is_valid = check_info(userinfo)
    is_success = writer_file(userinfo, is_valid)
    if is_success:
        print('注册成功!')
    else:
        print('输入不合法!')


# 启动程序
if __name__ == '__main__':
    main()

2.面向对象的概念

核心:对象

对象对象的三大特征:
封装,继承,多态
程序中:
函数是存放功能的容器,
对象是存放功能与数据的容器.

小说中: 陈北玄和李七夜
主角的特征(先装嫩后装逼):      变量 --> 属性 
主角的神通(扮猪吃老虎):        函数 --> 方法

优点:扩展性高,可维护性搞.
缺点:代码复杂度高
应用场景:对扩展性要求高的地方.

3.推导1

程序是由数据和功能组成,本质就是定义一系列的数据
然后再定义一系列的功能来对数据进行操作.

学生选课系统 Version 1.0
数据与功能是分离的
如果用户的数据多了维护麻烦
# 学生信息1
stu1_name = 'kid'
stu1_age = 18
stu1_gender = 'male'
stu1_school = 'xxx'
stu1_courses = []  # 可以用多门课程,先定义为一个空列表

# 学生信息2
stu2_name = 'qq'
stu2_age = 18
stu2_gender = 'female'
stu2_school = 'xxx'
stu2_courses = []  # 可以用多门课程,先定义为一个空列表


# 选课函数
def elective(stu_name, stu_courses, course):
    stu_courses.append(course)
    print('%s成功选择%s课程!' % (stu_name, course))


# 调用函数选课
elective(stu1_name, stu1_courses, 'Python')  # kid成功选择Python课程!
elective(stu2_name, stu2_courses, 'linux')  # qq成功选择linux课程

4.推导2

学生选课系统 Version 2

每个同学的信息,散乱,查找/修改不方便,
使用字典类型存储,将学生信息封装成到字典容器中,方便区分学生的信息.
# 学生信息1
stu1 = {
    'name': 'kid',
    'age': 18,
    'gender': 'male',
    'school' = 'xxx'
    'courses': []  # 可以用多门课程,先定义为一个空列表
}

# 学生信息2
stu2 = {
    'name': 'qq',
    'age': 18,
    'gender': 'male',
    'school' = 'xxx'
    'courses': []  # 可以用多门课程,先定义为一个空列表
}


# 选课函数
def elective(stu_name, stu_courses, course):
    stu_courses.append(course)
    print('%s成功选择%s课程!' % (stu_name, course))


# 调用函数选课
elective(stu1['name'], stu1['courses'], 'Python')  # kid成功选择Python课程!
elective(stu2['name'], stu2['courses'], 'linux')  # qq成功选择linux课程

5.推导3

学生选课系统 Version 3
函数名可以作为容器类型的元素.
对象的雏形:字典中同时具有学生数据和选课功能.
# 选课函数
def elective(stu, course):
    stu['courses'].append(course)
    print('%s成功选择%s课程!' % (stu['name'], course))


# 学生信息1
stu1 = {
    'name': 'kid',
    'age': 18,
    'gender': 'male',
    'courses': [],
    'school' = 'xxx'
    'elective': elective  # 使用函数的特性
}

# 学生信息2

stu2 = {
    'name': 'qq',
    'age': 18,
    'gender': 'male',
    'courses': [],
    'school' = 'xxx'
    'elective': elective  # 使用函数的特性
}

stu1['elective'](stu1, 'Python')  # kid成功选择Python课程!
stu2['elective'](stu2, 'Linux')  # qq成功选择Linux课程!

6.推导4

学生选课系统 Version 4
多个学生注册,字典中会产生一些重复且不变的数据.
将这部分的数据提取出来.定义成一个函数,存放在这个可以共用的容器中.
减少代码的冗余.
# 选课函数
def elective(stu, course):
    stu['courses'].append(course)
    print('%s成功选择%s课程!' % (stu['name'], course))


# 共同部分
Student = {
    'school': 'xxx',
    'elective': elective
}

# 学生信息1
stu1 = {
    'name': 'kid',
    'age': 18,
    'gender': 'male',
    'courses': [],
}

# 学生信息2
stu2 = {
    'name': 'kid',
    'age': 18,
    'gender': 'male',
    'courses': [],
}


Student['elective'](stu1, 'Python')  # kid成功选择Python课程!

Student['elective'](stu2, 'Linux')  # kid成功选择Linux课程!
Python语言提供了类来更好将数据和功能存放.

7.类的定义

类的作用:解决对象中数据的冗余。
7.1简介
对象:特征和技能的结合体
:一系列相似的对象可以分为同一个类.
(同一个类中的事物都具备了相同的特征和技能)

站在不同的分类,划分的分类不一样.\:
我的盆友 xxx
xxx  石头 都是 东西类
xxx  猴子 都是 动物类
xxx  在座各位 都是人类 (你们都是大帅币)
7.2定义类
Python提供关键字 class 创建类.
语法格式:
class 类名(继承):
	""" 类的说明 """
	类体代码	

	
类名一般首字母大写,
# 注意事项:
1. 类名可以遵循变量名的命名规范
       驼峰体:
        大驼峰: UserName (类名推荐使用)
        小驼峰:  userName
# 2. 下划线 (类名尽量不使用使用)
类名后面的括号如果不写参数(继承)可以省略不写.
学生选课系统 Version 4 
多个学生注册,字典中会产生一些重复且不变的数据.
数据-->学校  功能-->选课 

将对象中重复的数据提取出来.存放在一个共用的容器中.
那么这个容器可以是类.这个过程称为封装.
类就是为存放相同的特征和技能而存在.

定义类将相同的数据放入类中
在类中定义的变量称为 属性
在类中定义的函数称为 方法
class Student():
    # 定义属性 同一个学校
    school = 'xxx'

    # 定义方法 选课
    def elective(stu, course):
        stu['courses'].append(course)
        print('%s成功选择%s课程!' % (stu['name'], course))
7.3实例化造对象
类名加括号称为实例化.
实例化之后得到一个对象,为一个空字典{}. (默认为空)
(可以使用字典的方法.)
# 实例化得到一个对象 stu1
stu1 = Student()
print(stu1)  # <__main__.Student object at 0x000001E71ECEC5C0>

# __dict__ 查看对象中的值
print(stu1.__dict__, type(stu1.__dict__))  # 结果为一个空字典   <class 'dict'>
7.4定义阶段
定义类发生的事:
1.立刻执行类体代码
2.产生一个类的名称空间,把类体内产生的名称都归档进名称空间.(字典)
3.把类的名称绑定给.__dict__ (类名.__dict__可以进行查看)
# 定义类
class Kind:
    num = 1
    print(num)  # 1


# 查看'字典'内的属性
print(Kind.__dict__)

"""
{'__module__': '__main__', 'num': 1,  <---< 看这里啊 <----<----<--
'__dict__': <attribute '__dict__' of 'Kind' objects>, 
'__weakref__': <attribute '__weakref__' of 'Kind' objects>,
 '__doc__': None}"""

8.对象独有属性

每次实例化之后的对象,都拥有自己独立的名称空间.
可以使用对象.__dict__查看对象中所有的值.
对象是一个字典,可以使用字典的方法.
一般情况下推荐使用对象的提供的.方式,不使用__dict__.
8.1增
实例化的对象是一个字典,使用字典添加值的方式,创建对象独有的属性.
对象.__dict__[key] = value
类提供.的方式创建值.
对象.key = value
# 定义类
class Student:
    # 定义属性 同一个学校
    school = 'xxx'

    # 定义方法 选课
    def elective(stu, course):
        stu['courses'].append(course)
        print('%s成功选择%s课程!' % (stu['name'], course))


# 实例化
stu1 = Student()
stu1.__dict__['name'] = 'kid'
stu1.__dict__['age'] = 18
stu1.__dict__['gender'] = 'male'
print(stu1.__dict__)  # {'name': 'kid', 'age': 18, 'gender': 'male'}

stu2 = Student()
# 类提供快捷方式
stu2.name = 'qz'
stu2.age = 18
stu2.gender = 'male'
print(stu2.__dict__)  # {'name': 'qz', 'age': 18, 'gender': 'male'}
8.2查
对象.__dict__[key]
对象.key
# 实例化
stu1 = Student()
stu1.__dict__['name'] = 'kid'
stu1.__dict__['age'] = 18
stu1.__dict__['gender'] = 'male'
print(stu1.__dict__)  # {'name': 'kid', 'age': 18, 'gender': 'male'}
print(stu1.__dict__['name'])  # kid
print(stu1.__dict__['age'])  # 18
print(stu1.__dict__['gender'])  # male


stu2 = Student()
# 类提供快捷方式
stu2.name = 'qz'
stu2.age = 18
stu2.gender = 'male'
print(stu2.__dict__)  # {'name': 'qz', 'age': 18, 'gender': 'male'}
print(stu2.name)  # qz
print(stu2.age)  # 18
print(stu2.gender)  # male
8.3改
对象.__dict__[key] = value (新值)
对象.key = value (新值)
# 实例化
stu1 = Student()
stu1.__dict__['name'] = 'kid'
stu1.__dict__['name'] = 'qzq'
stu1.age = 18
stu1.age = 19
print(stu1.__dict__['name'])  # qzq
print(stu1.age)  # 19
8.4删
# 实例化
stu1 = Student()
stu1.__dict__['name'] = 'kid'
del stu1.__dict__['name']
print(stu1.__dict__)  # {}

stu1.__dict__['age'] = 18
del stu1.__dict__['age']
print(stu1.__dict__)  # {}

9.推导5

学生选课系统 Version 5
1.先调用类产生一个对象(空字典{}),
2.在通过.的方式添加学生的数据到字典中.
3.对象调用方法,会将自己(对象自己)作为第一个参数进行传参,所以可以省略不写.

*** stu1.elective('Python') ==> stu1.elective(stu1, 'Python') ***
# 定义类
class Student:
    # 定义属性 同一个学校
    school = 'xxx'

    # 定义方法 选课
    def elective(stu, courses):
        stu.courses.append(courses)
        print('%s成功选择%s课程!' % (stu.name, courses))  # kid成功选择python课程!


# 实例化
stu1 = Student()
stu1.name = 'kid'
stu1.age = 18
stu1.gender = 'male'
stu1.courses = []

stu1.elective('Python')

# 实例化
stu2 = Student()
stu2.name = 'qz'
stu2.age = 19
stu2.gender = 'male'
stu2.courses = []

stu2.elective('Linux')

10.推导5升级

学生选课系统 Version 5升级
定义方法时约定俗成使用self作为形参接收对象.
# 定义类
class Student():
    # 定义属性 同一个学校
    school = 'xxx'

    # 定义方法 选课
    def elective(self, courses):
        self.courses.append(courses)
        print('%s成功选择%s课程!' % (self.name, courses))  # kid成功选择python课程!


# 实例化
stu1 = Student()
stu1.name = 'kid'
stu1.age = 18
stu1.gender = 'male'
stu1.courses = []

stu1.elective('Python')

# 实例化
stu2 = Student()
stu2.name = 'qq'
stu2.age = 19
stu2.gender = 'male'
stu2.courses = []

stu2.elective('Linux')

11.推导6

学生选课系统 Version 6升级

为对象增加值的过程重复,写进函数.
在创建对象独有属性时调用.
# 定义类
class Student:
    # 定义属性 同一个学校
    school = 'xxx'

    # 定义方法 选课
    def elective(self, courses):
        self.courses.append(courses)
        print('%s成功选择%s课程!' % (self.name, courses))  # kid成功选择python课程!




# 定义函数
def init(self, name, age, gender, courses):
    self.name = name
    self.age = age
    self.gender = gender
    self.courses = courses


# 实例化
stu1 = Student()
stu2 = Student()

init(stu1, 'kid', 18, 'male', [])
stu1.elective('Python')  # kid成功选择Python课程!


init(stu2, 'qz', 19, 'male', [])
stu2.elective('Linux')  # qz成功选择Linux课程!

12.推导7

函数部分是共用的,将共同分放进类中.
# 定义类
class Student:
    # 定义属性 同一个学校
    school = 'xxx'

    # 定义函数
    def init(self, name, age, gender, courses):
        self.name = name
        self.age = age
        self.gender = gender
        self.courses = courses

    # 定义方法 选课
    def elective(self, courses):
        self.courses.append(courses)
        print('%s成功选择%s课程!' % (self.name, courses))  # kid成功选择python课程!


# 实例化
stu1 = Student()
stu2 = Student()

Student.init(stu1, 'kid', 18, 'male', [])
Student.init(stu2, 'kid', 18, 'male', [])

stu1.elective('Python')  # kid成功选择Python课程!
stu2.elective('Linux')  # qz成功选择Linux课程!

13.推导7升级

类提供__init__方法,在实例时会自动执行__init__方法,
__init__方法会接收实例化时括号中传递的参数.类提供__init__方法,在实例时会自动执行__init__方法,
__init__方法会接收实例化时括号中传递的参数.
__init__方法称为初始化方法,它不能有返回值,如果非要返回,返回None.
# 定义类
class Student:
    # 定义属性 同一个学校
    school = 'xxx'

    def __init__(self, name, age, gender, courses):
        self.name = name
        self.age = age
        self.gender = gender
        self.courses = courses

    # 定义方法 选课
    def elective(self, courses):
        self.courses.append(courses)
        print('%s成功选择%s课程!' % (self.name, courses))  # kid成功选择python课程!


# 实例化
stu1 = Student('kid', 18, 'male', [])
stu1.elective('Python')

stu2 = Student('qz', 19, 'male', [])
stu2.elective('Linux')
最终的这个推导而来的就是面向对象编程,
对象编程:提前先定义类,在创造对象.

在这里插入图片描述


在这里插入图片描述

14.注意点

在这里插入图片描述

提示:实例属性应该在init中定义
在其他的方法对值进行修改的操作
而不是新增加,如果没初始化不要有值就写None.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值