面向对象编程(Object Oriented Programming)简称OOP:
用认识一个系统的方式来分析、设计和实现一个系统。
面试答案:封装、继承和多态即为面向对象
面向对象的方法包括:
面向对象的分析(OOA, Object-Oriented Analysis)
面向对象的设计(OOD, Object-Oriented Design)
面向对象的程序设计(OOP, Object-Oriented Program)
面向对象技术主要围绕以下几个概念:
对象、抽象数据类型、类、继承性、多态性。
面向对象VS面向过程:相辅相成
面向过程:
先有算法,后有结构
面向对象:
先有结构,后有算法
面向对象的优点
可重用性(类)
可扩展性(继承)
可管理性(接口)
OOP的四个基本机制
抽象
封装
继承与派生
多态性
类之重要:面向对象的核心
类的定义语法:
class <类名>(父类列表):
类变量…
初始化方法(self,对象的变量…)
类方法
静态方法
属性
成员方法/对象方法
析构方法
对象引用 = 类名(构造中需要的实参)
通过对象引用来寻找对象的变量和方法
对象引用.对象的变量
对象引用.对象方法([参数列表])
1.为对象开辟空间,使用__new__魔术方法;
2.调用初始化方法__init__初始化;
3.返回对象的引用。
1.类是对象的模板
2.一个类可以创建多个对象
3.对象是类一个特定的个体
4.对象有独立的内存空间,不会互相影响
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}")