python基础知识打卡第十二天——面向对象三大特性

面向对象三大特性:封装、继承、多态

1、封装

将属性和方法写到类里面的操作就是封装的体现,在使用时用类去创建一个一个实例对象,对外只提供方法或属性的接口。

2、继承

在Python中,所有类默认继承object类,object类是顶级类或基类;其他子类叫做派生类。

# ⽗父类A
class A(object):
def __init__(self):
self.num = 1
def info_print(self):
print(self.num)
# ⼦类B
class B(A):
pass
result = B()
result.info_print() # 1

继承分为单继承和多继承两种情况。

2.1、单继承

子类只有一个父类的继承形式成为单继承。

# 1. 师⽗父类
class Master(object):
	def __init__(self):
		self.kongfu = '[独门绝技]'
	def drive_car(self):
		print(f'运⽤{self.kongfu}开车')
# 2. 徒弟类
class Prentice(Master):
	pass
# 3. 创建对象xiaowang
xiaowang= Prentice()
# 4. 对象访问实例属性
print(xiaowang.kongfu)
# 5. 对象调用实例⽅法
xiaowang.drive_car()

2.2、多继承

所谓多继承就是一个类同时继承了多个父类。

# 1. 师⽗父类
class Master(object):
	def __init__(self):
		self.kongfu = '[独门绝技]'
	def drive_car(self):
		print(f'运⽤{self.kongfu}开车')
#3、创办驾校
class School(object):
	def __init__(self):
		self.kongfu = '[秋名山驾校独门绝技]'
	def drive_car(self):
		print(f'运⽤{self.kongfu}开车')
# 4. 徒弟类
class Prentice(School,Master):
	pass
# 5. 创建对象xiaowang
xiaowang= Prentice()
# 6. 对象访问实例属性
print(xiaowang.kongfu)
# 7. 对象调用实例⽅法
xiaowang.drive_car()

注意:当一个类有多个父类的时候,默认使用第⼀一个父类的同名属性和方法。

2.2.1子类重写父类同名方法和属性
class Master(object):
	def __init__(self):
		self.kongfu = '[独门绝技]'
	def drive_car(self):
		print(f'运⽤{self.kongfu}开车')

class School(object):
	def __init__(self):
		self.kongfu = '[秋名山驾校独门绝技]'
	def drive_car(self):
		print(f'运⽤{self.kongfu}开车')
# 独创技术
class Prentice(School, Master):
	def __init__(self):
		self.kongfu = '[独创得意的飘开车绝技]'
	def make_cake(self):
		print(f'运⽤{self.kongfu}开车')
xiaowang=Prentice()
print(xiaowang.kongfu)
xiaowang.drive_car()

子类和父类具有同名属性和方法,默认使用子类的同名属性和方法。

2.2.2子类调用父类同名方法和属性
class Master(object):
	def __init__(self):
		self.kongfu = '[独门绝技]'
	def drive_car(self):
		print(f'运⽤{self.kongfu}开车')

class School(object):
	def __init__(self):
		self.kongfu = '[秋名山驾校独门绝技]'
	def drive_car(self):
		print(f'运⽤{self.kongfu}开车')

class Prentice(School, Master):
	def __init__(self):
		self.kongfu = '[独创得意的飘开车绝技]'
	def drive_car(self):
		# 如果是先调⽤了⽗类的属性和⽅法,⽗类属性会    覆盖⼦类属性,故在调⽤属性前,先调⽤⾃⼰子类的初始化
		self.__init__()
		print(f'运⽤{self.kongfu}开车')
		# 调⽤父类⽅法,但是为保证调⽤到的也是⽗类的属性,必须在调⽤⽅法前调⽤⽗类的初始化
		def master_drive_car(self):
			Master.__init__(self)
			Master.make_cake(self)
		def school_drive_car(self):
			School.__init__(self)
			School.drive_cake(self)
xiaowang=Prentice()
print(xiaowang.drive_car)
print(xiaowang.master_drive_car)
print(xiaowang.school_drive_cake)
2.2.3 super()调用父类方法

使用super() 可以自动查找父类。调用顺序遵循 mro 类属性的顺序。比较适合单继承使用。


super().__init__()
super().drrive_car()

2.3 私有权限

在Python中,可以为实例属性和方法设置私有权限,即设置某个实例属性或实例方法不继承给子类。
设置私有权限的方法:在属性名和方法名 前面加上两个下划线 __。
私有属性和私有方法只能在类里面访问和修改。
在Python中,一般定义函数名get_xx 用来获取私有属性,定义set_xx 用来修改私有属性值。

3 多态

多态是一种使用对象的方式,子类重写父类方法,调用不同子类对象的相同父类方法,可以产生不同的执行结果。
实现步骤:

  • 定义父类,并提供公共方法
  • 定义子类,并重写父类方法
  • 传递子类对象给调用者,可以看到不同子类执行效果不同。
class Dog(object):
	def work(self): # ⽗父类提供统一的方法,哪怕是空⽅法
		print('指哪打哪...')
class ArmyDog(Dog): # 继承Dog类
	def work(self): # ⼦类重写父类同名⽅法
		print('追击敌人...')
class DrugDog(Dog):
	def work(self):
		print('追查毒品...')
class Person(object):
	def work_with_dog(self, dog): # 传⼊不同的对象,执行不同的代码,即不同的work函数
		dog.work()
ad = ArmyDog()
dd = DrugDog()
ff= Person()
ff.work_with_dog(ad)
ff.work_with_dog(dd)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值