掉进悬崖的小白,学习python基础第二周,面向对象编程,用类描述事物,学会封装。用python编写普通用户类(登录注册)。

掉进悬崖的小白,学习python基础第二周,面向对象编程,用类描述事物,学会封装。用python编写普通用户类(登录注册)。

面向对象的概念

面向对象编程(Object Oriented Programming)简称OOP:
用认识一个系统的方式来分析、设计和实现一个系统。

面试答案:封装、继承和多态即为面向对象

面向对象的方法包括:
面向对象的分析(OOA, Object-Oriented Analysis)
面向对象的设计(OOD, Object-Oriented Design)
面向对象的程序设计(OOP, Object-Oriented Program)

面向对象技术主要围绕以下几个概念:
对象、抽象数据类型、类、继承性、多态性。

面向对象VS面向过程:相辅相成
面向过程:
先有算法,后有结构

面向对象:
先有结构,后有算法

面向对象的优点
可重用性(类)
可扩展性(继承)
可管理性(接口)

OOP的四个基本机制
抽象
封装
继承与派生
多态性

类(class):一种复杂的自定义数据类型

类之重要:面向对象的核心

类的定义语法:
class <类名>(父类列表):
类变量…
初始化方法(self,对象的变量…)
类方法
静态方法
属性
成员方法/对象方法
析构方法

使用类的方式:和一般类型一致

(声明->赋值->使用)

如何声明:

对象引用 = 类名(构造中需要的实参)

使用:

通过对象引用来寻找对象的变量和方法
对象引用.对象的变量
对象引用.对象方法([参数列表])

对象的构造过程

1.为对象开辟空间,使用__new__魔术方法;
2.调用初始化方法__init__初始化;
3.返回对象的引用。

类和对象的关系:

1.类是对象的模板
2.一个类可以创建多个对象
3.对象是类一个特定的个体
4.对象有独立的内存空间,不会互相影响

初始化方法:

def init(self,[参数列表]):pass

self可以换成别的标识符,但帅的好看的人都用它
类特殊的魔法方法

作用:

为对象注入初始的成员变量
初始化对象的成员变量

注意事项:

系统为每个类自动提供一个默认的无参的初始化方法;
若自定义初始化方法,无参初始化方法不再提供.

self :对象方法中必备的第一个参数

声明:初始化及每个对象方法必须写,且必须为第一参数

作用:
1.初始化或对象方法被调用时,立即自动指向调用该方法的对象,无需显式传参
2.区分同名的局部变量和对象变量

def init(self,name, age, pid):
self.name = name
self.age = age
self.pid = pid

析构方法:

声明:
def del(self):
print(self,“将被释放”)

使用:
程序中的对象有垃圾回收器(garbage collector)负责释放,回收之前会自动调用对象对应类的析构方法,做释放前的准备工作(关闭占用资源等)。

注意事项:
1.一个类只有一个析构方法
2.除非特殊需要,通常被省略。

访问级别

访问级别的用处在于控制类的成员在哪些地方可以被访问。

完全公开: 标识符不以_开始
保护(单下划线前缀) :_标识符
私有(双下划线前缀) :__标识符

完全公开:任意位置均可访问
保护:当前类及子类可访问
私有:只能在当前类内访问

xxx 系统预定义的名字,前后均有一个“双下划线” 代表python里魔法方法专用的标识,如 init ()代表类的初始化方法。

封装(行为(方法)和字段(数据)的结合)

封装的含义:将字段(数据成员)和行为(代码成员)相组合的一种机制。

目的:*
1.控制对象状态的范围
2.加强对象自身的内联(联动)性
3.便于外部使用

封装的基本要求:

特定边界:所有的内部变化都限制在此边界内(类内部);
特定访问权限:在对象外部不能访问或修改受保护的内部实现细节(__成员)
有外部接口(set/get方法):此对象利用它与其它对象发生关联

例:银行的取钱方案等

使用属性装饰器来完成封装:

class Person:
    @property
    def gender(self):
        return self.__gender

    @gender.setter
    def gender(self, gender):
        if gender == "男" or gender == "女":
            self.__gender = gender
            return
        print("must be 男 or 女")

    @gender.deleter
    def gender(self):
        del self.__gender


per1 = Person()
per1.gender = "男"
print(per1.gender)
per1.gender = "兽"
print(per1.gender)

主要用于快速构建代码:
prop+回车:生成只读属性
props+回车:生成可读写属性
propsd+回车:生成可读写删属性

定义一个普通用户类

普通用户类具备的属性:用户名、密码、权限

普通用户类具备的方法:登录、注册

# 注意:请详细测试该类
# 对象列表
# 数据库对应的对象列表
# [1,2,3,4]
# ["1","3"]
# 对象放入列表
class User:

    def __init__(self, user_name, password, pri) -> None:
        super().__init__()
        self.user_name = user_name
        self.password = password
        self.pri = pri

    def login(self, user_name, password):
        return self.user_name == user_name and self.password == password

    def register(self, user_name, password, pri):
        self.user_name = user_name
        self.password = password
        self.pri = pri


# 准备数据库中的对象列表
users = \
    [
        User("admin", "123", "admin"),
        User("user1", "123", "user"),
        User("user2", "123", "user"),
        User("user3", "123", "user"),
        User("g1", "123", "guest"),
    ]
# 模拟前端验证
# 登录的效果
# for j in range(3):
#     user_name = input("用户名:")
#     password = input("密  码:")
#     # 去挨个匹配数据库中的对象 是否有对象匹配上
#     # 保持登录用户的变量
#     login_user = None
#     for i in range(len(users)):
#         if users[i].login(user_name,password):
#             print("登录成功")
#             login_user = users[i]
#             break
#     else:
#         print("用户名或密码错误!" if j != 2 else "24小时内无法再次登录!")
#
#     if login_user is not None:
#         break

# 模拟前端的注册
# 注册的效果
# 问用户要信息
register_user = User(None, None, None)
user_name = input("注册用户名:")
while 1:
    password = input("注册密码:")
    re_password = input("重复密码:")
    if password != re_password:
        print("两次输入不一致 请重新输入!")
        continue
    break
# 产生用户对象
register_user.register(user_name, password, "admin")
# 对象存入数据库
users.append(register_user)

# 遍历数据库 验证是否注册完毕
for i in range(len(users)):
    print(f"用户名:{users[i].user_name} 密码:{users[i].password} 权限:{users[i].pri}")

你可能感兴趣的:(python小白,面向对象,类,封装,普通用户类,登录注册)