从零开始python——面向对象开发2

从零开始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. 对父类方法进行拓展

1) 覆盖父类的方法

扫描二维码关注公众号,回复: 9681775 查看本文章
  • 如果在开发中,父类的方法实现子类的方法实现完全不同
  • 就可以使用 覆盖 的方式,在子类中 重新编写 父类的方法实现

具体的实现方式,就相当于在 子类中 定义了一个 和父类同名的方法并且实现

重写之后,在运行时,只会调用子类中重写的方法,而不再回调用父类的方法

2) 对父类方法进行 扩展

  • 如果在开发中,子类的方法实现 中 包含 父类的方法实现
    • 父类原本封装的方法实现子类方法的一部分
  • 就可以使用 扩展 的方式
    1. 子类中 重写 父类的方法
    2. 在需要的位置使用 super().父类方法 来调用父类方法的执行
    3. 代码其他的位置针对子类的需求,编写 子类特有的代码实现

关于 super

  • 在 Python 中 super 是一个 特殊的类
  • super() 就是使用 super 类创建出来的对象
  • 最常 使用的场景就是在 重写父类方法时,调用 在父类中封装的方法实现

3.13父类的私有属性和私有方法

  1. 子类对象 不能 在自己的方法内部,直接 访问 父类的 私有属性 或 私有方法
  2. 子类对象 可以通过 父类 的 公有方法 间接 访问到 私有属性 或 私有方法
  • 私有属性、方法 是对象的隐私,不对外公开,外界 以及 子类 都不能直接访问
  • 私有属性、方法 通常用于做一些内部的事情
    示例

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 的输出结果 从左至右 的顺序查找的
  • 如果在当前类中 找到方法,就直接执行,不再搜索
  • 如果 没有找到,就查找下一个类 中是否有对应的方法,如果找到,就直接执行,不再搜索
  • 如果找到最后一个类,还没有找到方法,程序报错
发布了11 篇原创文章 · 获赞 44 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/soul_study/article/details/104745552