从零开始python——面向对象开发2
太原理工大学机器人团队20日打卡day10
1、内置方法和属性
2、私有属性和私有方法
3、继承
昨天晚上躺在床上时候还在想有没有用于arduino的python编译器,好像是没有的,不过树莓派可以。呢么我们利用一些arduino做简单的控制和数据处理,再传给树莓派,在树莓派上我们再把一个个arduino看成是一个个对象…后来想了下,这样开发成本好像太高了,暂时当个玩笑吧 。
1、内置方法和属性
注:该部分所有__init__,del,均表示两边分别于有两个下划线,但是因为编辑器问题,变成了加重
方法名 | 类型 | 作用 |
---|---|---|
del | 方法 | 对象从内存中销毁前,会被自动调用 |
str | 方法 | 返回对象的描述信息,print函数输出使用 |
1.1del方法
- 在 Python 中
- 当使用 类名() 创建对象时,为对象 分配完空间后,自动 调用 init 方法
- 当一个 对象被从内存中销毁 前,会 自动 调用 del 方法
- 应用场景
- init 改造初始化方法,可以让创建对象更加灵活
- del 如果希望在对象被销毁前,再做一些事情,可以考虑一下 del 方法
- 生命周期
- 一个对象从调用 类名() 创建,生命周期开始
- 一个对象的 del 方法一旦被调用,生命周期结束
- 在对象的生命周期内,可以访问对象属性,或者让对象调用方法
class Cat:
def __init__(self, new_name):
self.name = new_name
print("%s 来了" % self.name)
def __del__(self):
print("%s 去了" % self.name)
# tom 是一个全局变量
tom = Cat("Tom")
print(tom.name)
# del 关键字可以删除一个对象
del tom
print("-" * 50)
1.2str方法
- 在 Python 中,使用 print 输出 对象变量,默认情况下,会输出这个变量 引用的对象 是 由哪一个类创建的对象,以及 在内存中的地址(十六进制表示)
- 如果在开发中,希望使用 print 输出 对象变量 时,能够打印 自定义的内容,就可以利用__str__ 这个内置方法了
注意: str 方法必须返回一个字符串
class Cat:
def __init__(self, new_name):
self.name = new_name
print("%s 来了" % self.name)
def __del__(self):
print("%s 去了" % self.name)
def __str__(self):
return "我是小猫:%s" % self.name
tom = Cat("Tom")
print(tom)
2、私有属性和私有方法
应用场景
- 在实际开发中,对象 的 某些属性或方法 可能只希望 在对象的内部被使用,而 不希望在外部被访问到
- 私有属性 就是 对象 不希望公开的 属性
- 私有方法 就是 对象 不希望公开的 方法
定义方式
- 在 定义属性或方法时,在 属性名或者方法名前 增加 两个下划线,定义的就是 私有 属性或方法
3、继承
3.1单继承
3.11继承的概念、语法和特点
继承的概念:子类拥有父类的所有方法和属性
继承的语法:
class 类名(父类名)
pass
- 子类 继承自 父类,可以直接 享受 父类中已经封装好的方法,不需要再次开发
- 子类 中应该根据 职责,封装 子类特有的 属性和方法
继承具有传递性
3.12重写
- 当父类的方法不能满足子类需求时,可以对方法进行重写
重写父类方法有两种情况
-
覆盖父类的方法
-
对父类方法进行拓展
1) 覆盖父类的方法
- 如果在开发中,父类的方法实现 和 子类的方法实现,完全不同
- 就可以使用 覆盖 的方式,在子类中 重新编写 父类的方法实现
具体的实现方式,就相当于在 子类中 定义了一个 和父类同名的方法并且实现
重写之后,在运行时,只会调用子类中重写的方法,而不再回调用父类的方法
2) 对父类方法进行 扩展
- 如果在开发中,子类的方法实现 中 包含 父类的方法实现
- 父类原本封装的方法实现 是 子类方法的一部分
- 就可以使用 扩展 的方式
- 在子类中 重写 父类的方法
- 在需要的位置使用 super().父类方法 来调用父类方法的执行
- 代码其他的位置针对子类的需求,编写 子类特有的代码实现
关于 super
- 在 Python 中 super 是一个 特殊的类
- super() 就是使用 super 类创建出来的对象
- 最常 使用的场景就是在 重写父类方法时,调用 在父类中封装的方法实现
3.13父类的私有属性和私有方法
- 子类对象 不能 在自己的方法内部,直接 访问 父类的 私有属性 或 私有方法
- 子类对象 可以通过 父类 的 公有方法 间接 访问到 私有属性 或 私有方法
- 私有属性、方法 是对象的隐私,不对外公开,外界 以及 子类 都不能直接访问
- 私有属性、方法 通常用于做一些内部的事情
示例
3.2多继承
概念
- 子类 可以拥有 多个父类,并且具有 所有父类 的 属性 和 方法
语法
class 子类名(父类名1, 父类名2...)
pass
注意事项
- 如果 不同的父类 中存在 同名的方法,子类对象 在调用方法时,会调用 哪一个父类中的方法呢?
提示:开发时,应该尽量避免这种容易产生混淆的情况! —— 如果 父类之间 存在 同名的属性或者方法,应该 尽量避免 使用多继承
Python 中的 MRO —— 方法搜索顺序
- Python 中针对 类 提供了一个 内置属性 mro 可以查看 方法 搜索顺序
- MRO 是 method resolution order ,主要用于 在多继承时判断 方法、属性 的调用 路径
print(C.__mro__)
输出结果
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class'object'>)
- 在搜索方法时,是按照 mro 的输出结果 从左至右 的顺序查找的
- 如果在当前类中 找到方法,就直接执行,不再搜索
- 如果 没有找到,就查找下一个类 中是否有对应的方法,如果找到,就直接执行,不再搜索
- 如果找到最后一个类,还没有找到方法,程序报错