Python:面向对象的三大特征(封装、继承、多态)

面向对象的三大特征:

特征 简述
封装 提高程序的安全性
继承 提高代码的复用性
多态 提高程序的可扩展性和可维护性

封装:

  • 将数据(属性)和行为(方法)包装到类对象中。在方法内部对其属性进行操作,在类对象外部调用方法。这样,无需关系内部方法的实现细节,隔离了复杂性。
  • 在Python中没有专门的修饰符用于属性的私有,如果该属性不希望被类对象外部被访问,属性名前使用两个“_”。
class Student:
    def __init__(self, name, age):
        self.name = name
        self.__age = age  # 隐藏属性

    def get_age(self):
        print(self.__age)


stu = Student('Alen', 20)
stu.get_age()  # 20
# print(stu.__age)  # AttributeError: 'Student' object has no attribute '__age'
print(stu._Student__age)  # 20,特殊方法可以获取,不建议使用

继承

语法:class 子类类名(父类1,父类2...):

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

代码示例:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def info(self):
        print(self.name, self.age)


class Student(Person):
    def __init__(self, name, age, score):
        super().__init__(name, age)
        self.score = score


class Teacher(Person):
    def __init__(self, name, age, job_title):
        super().__init__(name, age)
        self.job_title = job_title


stu1 = Student('张三', 15, 55)
stu1.info()  # 张三 15
tec1 = Teacher('李老师', 42, '班主任')
tec1.info()  # 李老师 42

方法重写

父类的某个属性或者方式不满足子类的使用要求时,子类可以在其方法体内进行重写。

子类重写后的方法中可以通过super().父类方法名()调用父类中被重写的方法。

代码示例:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def info(self):
        print('姓名:', self.name, ',年龄:', self.age)


class Student(Person):
    def __init__(self, name, age, score):
        super().__init__(name, age)
        self.score = score

    def info(self):  # 重写info方法
        super().info()  # 调用父类的方法
        print('成绩:', self.score)


stu1 = Student('张三', 15, 55)
stu1.info()  # 姓名: 张三 ,年龄: 15  成绩: 55

object类

object类是所有类的父类,因此所有类都有object类的属性和方法。

  • 内置函数dir()可以查看知道对象所有的属性
  • object有一个__str__()方法,用于返回对于“对象的描述”,对应于内置函数str()常用于print()方法,帮我们查看对象的信息,所以经常会对__str__()进行重写
class Student:
    def __init__(self, name, age, score):
        self.score = score
        self.name = name
        self.age = age

    def __str__(self):  # 重写了对象的描述
        return '姓名:'+self.name+',年龄:'+self.age+',成绩:'+self.score


stu1 = Student('张三', '15', '55')
print(dir(stu1))  # 查看对象所有属性,继承于object类

# ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
# '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
# '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'name', 'score']

print(stu1)  # 默认调用__str__()方法;输出:姓名:张三,年龄:15,成绩:55

多态

多态:具有多种形态,指:即便不知道一个变量所引用的对象到底是什么类型,仍然可以通过这个变量调用方法,在运行的过程中根据变量所引用对象的类型,动态地决定调用哪个对象中的方法。

class Animal:
    def eat(self):
        print('动物吃东西')


class Dog(Animal):
    def eat(self):  # 重写父类方法
        print('狗吃骨头')


class Cat(Animal):
    def eat(self):  # 重写父类方法
        print('猫吃鱼')


class Human:
    def eat(self):
        print('人吃各种美食')

        
def fun(a):
    a.eat()


fun(Animal())  # 动物吃东西
fun(Dog())  # 狗吃骨头
fun(Cat())  # 猫吃鱼
fun(Human())  # 人吃各种美食
静态语言和动态语言关于多态的区别
Python是动态语言,Java是静态语言。

静态语言事项多态的三个必要条件:

  • 继承
  • 方法重写
  • 父类引用指向子类对象

动态语言的多态:不关心对象的类型,只关心对象的行为。有指定的行为即可执行。

你可能感兴趣的:(python)