Python:面向对象进阶

62 阅读4分钟

1.面向对象的特性

面向对象编程有三个特性:封装、继承、多态

  • 封装

面向对象的程序设计中,某个类把所需要的数据(也可以说是类的属性)和对数据的操作(也可以说是类的行为)全部封装在类中,分别称为类的成员变量和方法(或成员函数)。这种把成员变量和成员函数封装在一起的编程特性称为封装

  • 继承

继承是指可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展

  • 多态

多态是指一类事物中有多种形态。如序列类型有多种形态:字符串、列表、元组;动物有多种形态:猫、狗、狐狸。多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的奇数,赋值之后,父对象可以根据当前赋值给他的子对象的特性以不同的方式运作

2.封装

封装分为:数据封装方法封装

数据封装即是把对象的属性具体的值隐藏起来,对外部显示的只是对象的属性名,例如:张三的名字,钱包里面的钱。

方法封装即对外只需要通过方法名就能调用方法,不需要了解具体方法中的细节。比如洗衣机,按照洗衣的功能按钮,就能进行洗衣,我们不需要知道这个过程的原理。

封装的的作用:数据封装的主要作用是保护隐私;方法封装的主要原因是隔离复杂度

封装的两个层面

第一层面的封装:创建类和对象时,分别创建两者的名称空间。只能通过类名加“.”或者对象.的方式访问里面的名字

第二层面的封装:类中把某些属性和方法隐藏起来,或者定义为私有,只在类的内部使用,在类的外部无法访问,或者留下少量的接口(函数)供外部访问

3.继承

概念:当我们定义一个class的时候,可以从某个现有的class继承属性和方法,新的class称为子类,而被继承的class称为基类、父类或超类。继承在某个类中所有的属性及方法(不包含私有)都用在自身类中。

  • 生活中的继承:一般指的是子女继承父辈的财产
  • 子女即为子类,父辈即为基类、父类或超类
class Person():
    __age= 18

    def __eat(self):
        print(self.__age)
        print('吃')

    def drink(self):
        print('喝')
        self.__eat()

p1=Person()
p1.drink()

输出结果:

image.png

可以看出【__age】和【__eat】虽然是私有属性,但是在同一个类中,内部是可以调用的。

class Person():  #定义的Person类(父类)
    __age= 18    #私有属性

    def __eat(self):     #私有属性
        print(self.__age)
        print('吃')

    def drink(self):
        print('喝')
        self.__eat()

class Student(Person):     #定义的Student类(子类)
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def drink(self):
        print('这是子类的方法')

student1 = Student('Lucy',18)
student1.drink()
print(student1.name)

输出结果:

image.png

分析:Student类是Person类的子类,说明Student类就有Person类所有的属性和方法,但是我们在代码中定义的student1,在调用drink方法时,发现Student类和Person类都有,但是结果显示的是Student类中的drink。所以得出结论:当子类和父类有一样的方法时,先执行子类,若在子类中能够找到,后面的就不找了;若子类中找不到再去父类中进行查找。

继承的方法有两种

  1. Person.方法(self)→Person.drink(self) #继承的是指定的一个父类
  2. super().方法()→super().drink() #继承的是按照顺序的上一个父类

以上的都是单个继承的方式,接下来看看多继承的方式

多继承

#多继承
class A():
    def speak(self):
        print('A类')
    def skill(self):
        print('唱歌')

class B():
    def speak(self):
        print('B类')
    def skill(self):
        print('跳舞')

class C(A,B):
    def speak(self):
        print('C类')
        super(C,self).speak()   #访问上一个父类(A类)
        B.speak(self)           #访问指定父类(B类)

c = C()
c.speak()
print(C.mro())    #查看C类的继承顺序

输出结果:

image.png

多态

多态:基于继承关系,同一个类中的不同对象,使用相同的方法产生不同的效果

class Animail():
    def eat(self):
        print('吃饭')

class Rabit(Animail):
    def eat(self):
        print('吃胡萝卜')

class Dog(Animail):
    def eat(self):
        print('吃骨头')

class Cat(Animail):
    def eat(self):
        print('吃鱼')

def fun(obj):   #接收一个实例化对象
    obj.eat()
rab1 = Rabit()   #实例化
dog1 = Dog()
cat1 = Cat()
fun(rab1)
fun(dog1)
fun(cat1)

结果:

image.png