python编程语言之封装、继承、多态、模块

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 安装的模块

  • 自定义模块:自己写的模块
    图片