面向对象三大特征是:
- 封装 (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 = brand
self.capacity = capacity
# 是否关闭
self.is_closed = False
# 模式 0:未设定模式 1:轻揉模式 2:狂揉模式
self.__mode = 0
# 马达转速
self.motor_speed = 0
def open_door(self):
self.is_closed = False
print('打开洗衣机门')
def close_door(self):
self.is_closed = True
print('关闭洗衣机门')
def set_mode(self, new_mode):
"""
调节模式
:param new_mode:
:return:
"""
if new_mode not in [1, 2]:
print('设置模式错误')
else:
self.__mode = new_mode
def __set_motor_speed(self, speed):
"""
设置马达的转速
:param speed: 1000: 轻揉模式 2000:狂揉模式
:return:
"""
self.motor_speed = speed
def wash(self):
if not self.is_closed:
# 洗衣机门是否关闭 ,没有关闭 提示
print('请关闭洗衣机门,哔哔哔哔...')
return
elif 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 />![](https://cdn.nlark.com/yuque/0/2023/png/27903758/1684835177145-5d8d0d61-8c21-4ac4-9d08-ff213cb87e77.png#averageHue=%23f9f8f7&clientId=ue22aa816-85ad-4&from=paste&id=uda0a34e3&originHeight=240&originWidth=443&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=u1eae5020-67d3-468f-9777-3085ca1060f&title=)<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 = name
def 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
类。