面向对象三大特性


本章概述:python基础——面向对象三大特性


面向对象编程有三大特性,分别为封装继承多态。这篇博客主要是讲这三大特性。

1、封装

封装很容易理解,就是把类中的方法隐藏起来,我们不需要关注类中的方法是怎么写的,我们只需要知道怎么去调用类的方法就可以了。像现在网站有很多的这种API接口,我们用这些api接口可以很方便的实现我们想要的功能,比如查询天气等等,但是这种api接口内部的代码是怎样的,我们肯定是不知道的,我们只知道API的名字以及所需要的参数,这种就是封装。

python把面向对象发挥到了极致,一切皆对象并不是说说而已,前面所说的数据类型——字符串、列表等等,实际上也是对象,这些对象并不需要我们去自定义类,python已经黑我们内置好了。

2、继承

面向对象的编程语言支持在已有类的基础上创建新类,从而减少重复代码的编写。提供继承信息的类叫做父类(超类、基类),得到继承信息的类叫做子类(派生类、衍生类),这就是继承,继承指的是事物之间的所属关系,在python中,每一个类默认都会继承object这个父类。继承只能继承公有的不能继承私有的属性或方法。

举个例子,我们定义狗和猫两个类,我们会发现这两个类有些行为是一样的,而这些一样的行为都是作为狗和猫的公共属性或行为,这个时候,我们可以先定义动物这个类,然后再定义狗和猫,并且继承动物类,这些公共属性或行为是属于动物这个类的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Animal(object):  
'''父类'''
def __init__(self,name):
self.name=name

def eat(self):
print(f"{self.name}在吃饭")
def sleep(self):
print(f"{self.name}在睡觉")

class Dog(Animal): #继承Animal类
'''子类'''
def __init__(self,name,color):
super().__init__(name) # 调用父类的初始化方法
self.color=color

def shout(self):
print(f"{self.name}在大叫")

class Cat(Animal):
'''子类'''
def catch(self):
print("抓")

dog1=Dog('dog1','白色')
dog1.eat() # 使用父类的公共方法
cat1=Cat('cat1')
cat1.sleep()

继承的语法是在定义类的时候,在类名后的圆括号中指定当前类的父类。如果定义一个类的时候没有指定它的父类是谁,那么默认的父类是object类。object类是Python中的顶级类,这也就意味着所有的类都是它的子类,要么直接继承它,要么间接继承它。Python语言允许多重继承,也就是说一个类可以有一个或多个父类。在子类的初始化方法中,我们可以通过super().__init__()来调用父类初始化方法。子类继承父类的方法后,还可以对方法进行重写(重新实现该方法),不同的子类可以对父类的同一个方法给出不同的实现版本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Person:
def __init__(self,name,age):
self.name=name
self.age=age

def say_hello(self):
print(f'hello,我是{self.name}')

class Student(Person):
def say_hello(self): #重写父类的方法
print(f'hello,我是高一学生{self.name}')

s1=Student('小红',20)
s1.say_hello()
3、多态

多态是指同一个方法调用由于对象不同可能会产生不同的行为。重写父类的方法会表现出多态行为,调用相同的方法,做了不同的事情。所以多态的存在有2个必要条件:继承、方法重写。