面向对象之对象的三大特性

君自故乡来,应知故乡事 / 2023-06-26 / 原文

待补充

一、封装

封装是一种将数据和相关方法组合成一个单独的实体的机制。它将数据(属性)和操作数据的方法(方法)封装在一个对象中,并对外部代码隐藏了内部的实现细节。通过封装,对象可以提供一个公共接口,使得外部代码可以通过该接口访问和操作对象的数据,而不需要了解其内部的具体实现。

二、继承

继承是一种通过定义一个新类来继承现有类的属性和方法的机制。

它允许新类(子类)继承现有类(父类)的属性和方法,并且可以在新类中添加新的属性和方法,或者重写父类的方法来定制子类的行为。

继承促进了代码的重用和扩展(),并且提供了层次化和组织化的代码结构。

1、为什么要继承?
类解决什么问题:解决的是对象与对象之间的代码冗余问题
继承解决什么问题:解决的是类与类之间的代码冗余问题

2、子类的继承可以有多个父类

class Parent1(object):
    pass

class Parent2:
    pass

# 子类
class Sub1(Parent1):
    pass

# 多继承, 括号里面可以写多个类
class Sub2(Parent1, Parent2):
    pass

3、查看一个类继承了哪些父类,.__bases__方法

print(Sub1.__bases__) # (<class '__main__.Parent1'>,)
print(Sub2.__bases__) # (<class '__main__.Parent1'>, <class '__main__.Parent2'>)
print(Parent1.__bases__)  # (<class 'object'>,)

注:python3中新定义的父类默认继承的是object类,所以父类也是一个子类

4、继承小案例

class People:  # 定义一个父类
    school = 'SH'  # 严格依赖继承

    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender

class Student(People):
    def __init__(self, name, age, gender, course):
        """这个是指名道姓的调用方法,不依赖于继承"""
        People.__init__(self, name, age, gender)  # name, age, gender 继承父类的属性
        self.course = course

    # 选课
    def choose_course(self):
        pass

class teacher(People):
    def __init__(self, name, age, gender, level):
        People.__init__(self, name, age, gender)
        self.level = level  # 教室职称

stu = Student('kevin', '19', 'male', 'python')
teacher1 = teacher('王刚', 40, 'male', '高级教师')
print(stu.name)  # kevin
print(teacher1.level)  # 高级教师

三、多态

多态是指同一种操作或函数可以作用于不同的对象类型,并产生不同的行为。多态允许使用统一的接口来处理不同类型的对象,而不需要关心对象的具体类型。通过多态,可以编写通用的代码,减少了重复的代码和条件语句的使用,提高了代码的可扩展性和可维护性。多态实现了面向对象编程中的一个重要原则:针对接口编程,而不是针对实现编程。