1、封装
封装的概念
-
封装(
Encapsulation
)- 隐藏:属性和实现细节,不允许外部直接访问
- 暴露:公开方法,实现对内部信息的操作和访问
封装的作用
- 限制安全的访问和操作,提高数据安全性
- 可进行数据检查,从而有利于保证对象信息的完整性
封装的实现:隐藏
- 保护属性:
_属性名
- 私有属性:
__属性名
- 被视作
_类名__属性名
- 被视作
class Account:
"""账户"""
# 普通属性
bank = 'ACBC'
# 保护属性(内部属性)
_username = 'good good'
# 私有属性
__password = 'happy'
print(Account.bank) # ACBC
print(Account._username) # 虽然能调用,但是不推荐使用
print(Account.__password) # 会报错
封装的实现:暴露
- 提供数据访问功能(
getter
)- 计算属性
- 语法:使用
@property
装饰器 - 调用:
实例.方法名
class Account:
"""账户"""
# 普通属性
bank = 'ACBC'
# 保护属性(内部属性)
_username = 'good good'
# 私有属性
__password = 'happy'
@property
def password(self):
return self.__password
# 修改私有属性,调用的是上方的属性名
@password.setter
def password(self, value):
# 进行校验
if len(value) >= 8:
self.__password = value
else:
print('请输入8位以上的密码')
# 实例化对象
acc = Account()
# 调用私有属性
print(acc.password) # happy
# 修改私有属性(不满足条件)
acc.password = 'hsdjhj' # 请输入8位以上的密码,不满足会使用原本密码,不会更改
print(acc.password) # 打印的是happy
# 修改私有属性(满足条件)
acc.password = 'qwertyui' # 满足条件会更改,打印的是qwertyui
print(acc.password)
2、继承
继承的概念
- 继承(
Inheritance
)- 复用父类的公开属性和方法
- 拓展出新的属性和方法
继承的实现
- 语法:
class 类名(父类列表)
- 默认父类是
object
- Python 支持多继承
class Animal:
# 类属性
message = "这是Animal类的属性"
# 构造方法
def __init__(self, name, age):
self.name = name
self.age = age
# 实例方法
def cat(self):
print("猫吃鱼")
def dog(self):
print('狗吃肉')
class Panda(Animal):
def eat(self):
print('正在吃竹子')
# 实例化一个对象
huahua = Panda('花花', 3)
# 访问属性
print(huahua.message)
print(huahua.name, huahua.age)
# 访问实例方法
huahua.cat()
huahua.dog()
类型检查
-
isinstance(实例, 类名)
- 检查对象是否是某个类及其派生类的实例
-
issubclass(类名1, 类名2)
- 检查类名 1 是否是类名 2 的子类
class Human:
pass
class Student(Human):
pass
class Teacher(Human):
pass
# 检查实例与类之间的关系
# 是继承关系就返回True,不是继承关系就返回False
stu = Student()
print(isinstance(stu, Human)) # True
# 检查类与类之间的关系
# 是继承关系就返回True,不是继承关系就返回False
print(issubclass(Student, Teacher)) # False
3、多态
多态的概念
- 多态(
Polymorphism
)- 同名方法呈现多种行为
运算符的多态表现
-
+
号- 加法:数字+数字
- 拼接:字符串+字符串
- 合并:列表+列表
print(1 + 1 + 2 + 3)
print('hello' + ' how are you')
print([1, 2, 3] + [False])
7
hello how are you
[1, 2, 3, False]
函数的多态表现
-
len()
函数- 可以接收字符串
- 可以接收列表
print(len('hello')) # hello有5个字符,所以显示数字5
print(len([1, 2, 3] + [False])) #前面一个列表占3个字符,加上后面一共4个
5
4
- 同名变量调用同名方法呈现多种行为
class Animal:
# 实例方法
def eat(self):
print("猫吃鱼")
class Panda:
def eat(self):
print('正在吃竹子')
aa = Animal()
huahua = Panda()
for i in (aa, huahua):
i.eat()
猫吃鱼
正在吃竹子
多态与继承
- 方法重写(
Override
):子类的方法名称与父类的相同 - 重写构造方法
super().__init__()
父类名.__init__(self)
class Bird():
message = '这是父类方法'
# 构造方法
def __init__(self, name, age):
self.name = name
self.age = age
# 实例方法
def fly(self):
print("鸟类可以飞翔")
class Ostrich(Bird):
# 鸵鸟类
# 重写父类方法之super()方法
# 注意,super方法重写时有()
# def __init__(self, name, age, height):
# super().__init__(name, age)
# self.height = height
# 重写父类方法之父类名调用
def __init__(self, name, age, height):
# 父类有什么这边也要有什么
Bird.__init__(self, name, age)
self.height = height
# 实例化子类方法
huahua = Ostrich('huahua', 3, 49)
print(huahua.name)
print(huahua.height)
huahua
49
4、模块
模块就是一个.py的文件
模块导入方法
-
import 模块名
-
from <模块名> import <方法 | 变量 | 类>
-
from <模块名> import *
-
注意:
- 同一模块只能导入一次
- import应该放在代码最前端
-
模块分类
-
系统自带模块:sys、os、time、正则模块等
-
第三方开源模块:使用pip install 安装的模块
-
自定义模块:自己写的模块