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

一、封装

  • 将数据和行为包装到类对象中,提高程序的安全性。
  • 主要思想就是将代码提取出一个方法,一个类,在程序设计时还需要不断地去完善。
  • 同时类的一些属性不希望直接暴露给外界,让外界直接操作。因为这些属性可能有其特定的意义,如果让外接随意操作,可能最终结果并不是我们想要的。此时我们就需要将这些属性给封装起来,不让外界直接访问。
  • 在python中没有专门修饰符用于属性的私有,如果该属性不希望在类对象外部被访问,则添加两个"_"。
 1 class Car:
 2     """封装"""
 3     def __init__(self, name=None, brand=None):
 4         self.brand = brand
 5         self.__name = name
 6 
 7     def my_start(self):
 8         print("启动!")
 9         print(self.__name)
10 
11 
12 car = Car("133", "343")
13 print(car.brand)

二、继承

如果很多类具有着相同的属性和方法,那么这些属性和方法可以被提取出来,单独形成一个父类。之前的类再继承这个父类,就可以继承父类的属性和方法。因此,继承可以提高代码的复用性。

1. python中类的一些特点

  • 如果一个类没有继承任何类,则默认继承object
  • Python支持多继承,也就是一个类可以有多个父类
  • 定义子类时,必须在其构造函数中调用父类的构造函数

2. 方法重写

  如果子类对继承自父类的某个属性或方法不满意,也就是说某个属性无法满足子类的需求,可以在子类中对其进行重新编写。

  子类重写后的方法可以通过super().xxx()调用父类中被重写的方法,此时子类在执行重写的方法的同时,也会执行父类的属性或方法,在我看来相当于在子类的属性或方法里,调用了父类的同一个属性或方法。

3. object类

  • object类是所有类的父类,因此所有类都有object类的属性和方法
  • 内置函数dir()可以查看指定对象所有属性
  • Object有一个__str__()方法,用于返回一个对于“对象的描述",对应于内置函数str()经常用于print函数,帮我们查看对象的信息,所以我们经常会对__str__()进行重写
 1 class Person(object):   # person继承object类
 2     """继承"""
 3     def __init__(self, name, age):
 4         self.name = name
 5         self.age = age
 6 
 7     def info(self):
 8         print(self.name, self.age)
 9 
10 
11 class Student(Person):
12     def __init__(self, name, age, stu_no):
13         super().__init__(name, age)
14         self.stu_no = stu_no
15 
16     def info(self):            # 方法重写
17         super().info()
18         print(self.stu_no)
19 
20 
21 class Teacher(Person):
22     def __init__(self, name, age, teach_year):
23         super().__init__(name, age)
24         self.teach_year = teach_year
25 
26     def info(self):
27         super().info()
28         print(self.teach_year)
29 
30 
31 class Assistant(Teacher, Student):     # 多继承,同时继承多个父类
32     pass
33 
34 
35 stu = Student("张三", 20, "6667832")
36 teacher = Teacher("李四", 34, 16)
37 
38 stu.info()
39 teacher.info()
 1 class A:
 2     """
 3     __str__()重写,输出类的内存地址,这里将它重写
 4     """
 5     def __init__(self):
 6         self.name = "f"
 7 
 8     def __str__(self):
 9         return '我的名字是{}'.format(self.name)
10 
11 
12 a = A
13 print(a)    # 默认调用a.__str___()
三、多态
  • 提高代码的扩展性和可维护性。
  • 简单地来说,多态就是具有多种形态,它指的是:即便不知道一个变量所引用的对象到底是什么类型。仍然可以通过这个变量调用方法,在运行过程中根据变量所引用对象的类型,动态决定对象调用那个对象中的方法。
  • 有人说python中是没有多态的,因为python中没有数据类型,但是python中其实是有多态的这种特征。在python中,多态可以让不同功能的函数可以使用相同的函数名,这样就可以让一个函数名调用不同功能的函数。
  • 在面向对象中,多台一般可以这样理解:想不同的对象发送同一条信息,不同对象在接收时会产生不同的行为,也就是说每个对象可以通过自己的方式去响应共同的消息。直白一点讲就是,不同的类可以有同名函数。
 1 class Animal(object):
 2     def eat(self):
 3         print("dongwu")
 4 
 5 
 6 class Dog(Animal):
 7     def eat(self):
 8         print("gou")
 9 
10 
11 class Cat(Animal):
12     def eat(self):
13         print("mao")
14 
15 
16 def eat(obj):
17     obj.eat()
18 
19 
20 eat(Animal())
21 eat(Dog())
22 eat(Cat())