class Cat:def __init__(self, name):print("初始化方法 %s" % name)self.name = name...tom = Cat("Tom")...lazy_cat = Cat("大懒猫")...
2.5 私有属性和私有方法应用场景
- 在实际开发中 , 对象 的 某些属性或方法 可能只希望 在对象的内部被使用 , 而 不希望在外部被访问到
- 私有属性 就是 对象 不希望公开的 属性
- 私有方法 就是 对象 不希望公开的 方法
- 在 定义属性或方法时 , 在 属性名或者方法名前 增加 两个下划线 , 定义的就是 私有属性或方法:
文章插图
私有属性和私有方法
伪私有属性和私有方法Python 中 , 并没有 真正意义 的 私有在给 属性、方法 命名时 , 实际是对名称做了一些特殊处理 , 使得外界无法访问到处理方式:在 名称 前面加上_类名 => _类名__名称
# 私有属性 , 外部不能直接访问到print(xiaofang._Women__age)# 私有方法 , 外部不能直接调用xiaofang._Women__secret()
提示:在日常开发中 , 不要使用这种方式 , 访问对象的 私有属性 或 私有方法 。3. 封装、继承和多态面向对象三大特性:
- 封装 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中
- 继承 实现代码的重用 , 相同的代码不需要重复的编写
- 多态 不同的对象调用相同的方法 , 产生不同的执行结果 , 增加代码的灵活度
class 类名(父类名):pass
当 父类 的方法实现不能满足子类需求时 , 可以对方法进行重写(override)重写 父类方法有两种情况:- 覆盖 父类的方法:父类的方法实现 和 子类的方法实现完全不同
具体的实现方式 , 就相当于在 子类中 定义了一个 和父类同名的方法并且实现 。 - 对父类方法进行 扩展:子类的方法实现 中 包含 父类的方法实现
在子类中 重写 父类的方法;在需要的位置使用 super().父类方法 来调用父类方法的执行代码;其他的位置针对子类的需求 , 编写 子类特有的代码实现 。
- 在 Python 中 super 是一个 特殊的类
- super()就是使用 super 类创建出来的对象
- 最常 使用的场景就是在 重写父类方法时 , 调用 在父类中封装的方法实现
调用父类方法的另外一种方式:在 Python 2.x 时 , 如果需要调用父类的方法 , 还可以使用以下方式:父类名.方法(self) 。目前在 Python 3.x 还支持这种方式 , 但不推荐使用 , 因为一旦 父类发生变化 , 方法调用位置的 类名 同样需要修改 。父类的 私有属性 和 私有方法子类对象 不能 在自己的方法内部 , 直接 访问 父类的 私有属性 或 私有方法子类对象 可以通过 父类 的 公有方法 间接 访问到 私有属性 或 私有方法
私有属性、方法 是对象的隐私 , 不对外公开 , 外界 以及 子类 都不能直接访问 私有属性、方法 通常用于做一些内部的事情3.1.2 多继承子类 可以拥有 多个父类 , 并且具有 所有父类 的 属性 和 方法 , 例如:孩子 会继承自己 父亲 和 母亲 的 特性 。
class 子类名(父类名1, 父类名2...):pass
Python 中的 MRO算法(Method Resolution Order)- 如果 不同的父类 中存在 同名的方法 , 子类对象 在调用方法时 , 会调用 哪一个父类中的方法呢?
提示:开发时 , 应该尽量避免这种容易产生混淆的情况! —— 如果 父类之间 存在 同名的属性或者方法 , 应该 尽量避免使用多继承 。 - Python 中针对 类 提供了一个 内置属性__mro__ 可以查看 方法 搜索顺序 在搜索方法时 , 是按照 mro 的输出结果 从左至右 的顺序查找的 如果在当前类中 找到方法 , 就直接执行 , 不再搜索 如果 没有找到 , 就查找下一个类 中是否有对应的方法 , 如果找到 , 就直接执行 , 不再搜索 如果找到最后一个类 , 还没有找到方法 , 程序报错
推荐阅读
- 拆解固态硬盘结构
- 茉莉花茶怎么泡,茉莉花茶如何喝
- MITM 如何避免中间人攻击
- 茉莉花茶作用,喝茉莉花茶的好处和功效作用
- 洛神花茶降火吗,洛神花茶的功效及其作用
- 如何看玫瑰花茶好坏,玫瑰花茶到底是什么茶
- 桃花茶的功效与作用,桃花茶的功效和作用
- 花草茶常用有哪些,常用的花草茶有哪些
- 三七花茶的副作用与禁忌,牛蒡茶的副作用
- 百合花如何喝,茉莉花茶如何喝