面向对象三大特征是:
- 封装 (Encapsulation)
- 继承 (Inheritance)
- 多态 (Polymorphism)
封装
封装就是隐藏内部实现的细节,只保留功能接口
需求 :::info 定义一个洗衣机类,其中包含了打开/关闭洗衣机门、设置洗衣模式、设置马达转速、开始洗衣服等方法。
在初始化时,需要传入品牌brand和容量capacity两个参数。洗衣机门的状态is_closed、洗衣模式__mode和马达转速motor_speed都有默认值。
调用wash()方法时,会根据门的状态和模式来执行相应的操作,最终完成洗衣任务。 ::: 步骤:
- 定义
WashMachine类,初始化时传入品牌和容量两个参数,并设置默认值。 - 定义打开/关闭洗衣机门的方法,通过修改
is_closed属性来实现。 - 定义设置洗衣模式的方法,通过修改
__mode属性来实现。 - 定义设置马达转速的私有方法,通过修改
motor_speed属性来实现。 - 定义开始洗衣服的方法,根据门的状态和模式来执行相应的操作,最终完成洗衣任务。
- 实例化
WashMachine类,传入品牌和容量两个参数,得到一个洗衣机对象。 - 调用打开/关闭洗衣机门的方法,模拟打开/关闭洗衣机门的操作。
- 调用设置洗衣模式的方法,传入一个参数,设置洗衣模式。
- 调用开始洗衣服的方法,根据门的状态和模式来执行相应的操作,最终完成洗衣任务。
实现
class WashMachine:def __init__(self, brand, capacity):"""初始化:param brand: 品牌:param capacity: 容量"""self.brand = brandself.capacity = capacity# 是否关闭self.is_closed = False# 模式 0:未设定模式 1:轻揉模式 2:狂揉模式self.__mode = 0# 马达转速self.motor_speed = 0def open_door(self):self.is_closed = Falseprint('打开洗衣机门')def close_door(self):self.is_closed = Trueprint('关闭洗衣机门')def set_mode(self, new_mode):"""调节模式:param new_mode::return:"""if new_mode not in [1, 2]:print('设置模式错误')else:self.__mode = new_modedef __set_motor_speed(self, speed):"""设置马达的转速:param speed: 1000: 轻揉模式 2000:狂揉模式:return:"""self.motor_speed = speeddef wash(self):if not self.is_closed:# 洗衣机门是否关闭 ,没有关闭 提示print('请关闭洗衣机门,哔哔哔哔...')returnelif self.__mode == 0:print('请设置模式')return# 执行下面的操作print('放水...')print('放满了...')if self.__mode == 1:print('轻揉模式, 洗内衣')# 调节马达转速self.__set_motor_speed(1000)print('马达转速:{}'.format(self.motor_speed))print('开始洗...')elif self.__mode == 2:print('狂揉模式, 洗外套')# 调节马达抓霉素self.__set_motor_speed(2000)print('马达转速:{}'.format(self.motor_speed))print('开始洗...')print('洗完了')machine = WashMachine('海尔', 10)machine.open_door()machine.close_door()machine.set_mode(2)machine.wash()
封装的范围:
- 封装属性
- 封装成方法/函数
- 封装成类
- 封装模块和包
继承
继承指的是一个对象直接使用另一个对象的属性或方法
继承的格式:class 子类名(父类名):```python “””————————— 定义Person类 —————————“””
class Person: def init(self, name, age): self.name = name self.age = age
def say_hello(self):print('hello from ', self.name)
“””————————— 定义Student类继承Person —————————“””
class Student(Person): def init(self, name, age, height):
# 调用父类的初始化方法super().__init__(name, age)# 定义自己的属性self.height = height
创建学生类
stu = Student(‘小明’, 15, ‘180’)
访问属性
print(“name: {} age: {} height: {}”.format(stu.name, stu.age, stu.height))
调用方法
stu.say_hello()
`Student`类继承自`Person`类<br />可以使用`Person`类中定义的属性`name`和`age`以及方法`say_hello`<a name="EmkHb"></a>## 多态多态指的是一类事物有多种形态(一个类有多个子类)<br />多态的概念依赖于**继承**<br /><br />中国人、美国人、非洲人都是属于Human人类的子类<br />对于Human来说有多个子类就称为多态```python"""多态案例"""# 父类class Human:def eat(self):print('人类吃饭')# 中国人class ZhHuman(Human):def eat(self):print('中国人使用筷子吃饭')# 美国人class UsHuman(Human):def eat(self):print('美国人使用刀叉吃饭')# 非洲人class AfricaHuman(Human):def eat(self):print('非洲人直接用手吃恩希玛')# 函数def someone_eat(someone):'''接收一个具备吃eat功能的对象'''someone.eat()# 创建四个对象human = Human()zh_human = ZhHuman()us_human = UsHuman()africa_huamn = AfricaHuman()# 调用translate方法someone_eat(human)someone_eat(zh_human)someone_eat(us_human)someone_eat(africa_huamn)
someone_eat方法需要接收具备eat功能的对象,但是由于ZhHuman USHuman AfricaHuman都具备eat功能(继承了Human)。所以也可以传递到someone_eat方法中
扩展知识
鸭子类型
一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟可以被称为鸭子。这就是鸭子类型Duck Typing
对于上述多态中的的someone_eat
class Dog:def eat(self):print('狗吃骨头')# 函数def someone_eat(someone):'''接收一个具备吃eat功能的对象'''someone.eat()dog = Dog()someone_eat(dog)
someone_eat需要传递一个具备eat方法的对象,但是Dog也具备eat功能,所以也可以传递运行
这是由于python是动态类型语言,不能像C++、Java等静态类型语言一样,限制传递的数据类型
只要运行时发现dog对象有这个功能,就可以在函数中使用
多继承
当一个类从多个父类继承属性和方法时,就称为多继承。
多继承格式:class 子类(父类1,父类2...)
下面是一个使用多继承的示例案例,展示了一个动物类和一个能飞的特性类和游泳的特性类:
class Animal:def __init__(self, name):self.name = namedef eat(self):print(f"{self.name} is eating.")def sleep(self):print(f"{self.name} is sleeping.")class Flyable:def fly(self):print(f"{self.name} is flying.")class Swimmable:def swim(self):print(f"{self.name} is swimming.")class Duck(Animal, Flyable, Swimmable):def __init__(self, name):super().__init__(name)duck = Duck("Donald")duck.eat() # 输出: Donald is eating.duck.sleep() # 输出: Donald is sleeping.duck.fly() # 输出: Donald is flying.duck.swim() # 输出: Donald is swimming.
在上面的示例中,Animal是基类,Flyable和Swimmable是特性类。Duck类通过多继承从这些类继承了属性和方法。通过调用这些继承的方法,我们可以看到Duck对象具有吃、睡、飞和游泳的行为。
注意,在多继承的情况下,当多个父类中具有相同名称的方法时,解释器将按照方法解析顺序(Method Resolution Order,MRO)来确定使用哪个方法。在上述示例中,Python的默认MRO算法会按照类定义时的顺序来解析方法。在这个例子中,Duck类首先从Animal类继承方法,然后是Flyable类,最后是Swimmable类。
