Python的进阶之道【AIoT阶段一(上)】(十五万字博文 保姆级讲解)—玩转Python语法(二):面向对象—不会吧不会吧,你居然还没有对象(1)(五)

简介: 玩转Python语法(二):面向对象

4.不会吧不会吧,你居然还没有对象

*4.1 面向对象的三大特征

注:本小节带 *,不需要进行学习,可以简单进行了解

⛲️ 封装:提高程序的安全性

将数据(属性)和行为(方法)包装到类对象中。在方法内部对属性进行操作,在类对象的外部调用方法。这样,无需关心方法内部的具体实现细节,从而隔离了复杂度。

在Python中没有专门的修饰符用于属性的私有,如果该属性不希望在类对象外部被访问,前边使用两个_ 。


继承:提高代码的复用性

多态:提高程序的可扩展性和可维护性


接下来,我们来具体介绍这三大特征


4.2 封装

🚩将数据(属性)和行为(方法)包装到类对象中。在方法内部对属性进行操作,在类对象的外部调用方法。这样,无需关心方法内部的具体实现细节,从而隔离了复杂度。

❗️ 注:下面的代码使用了 __init__() 方法,后续会有讲解,读者这里只需要知道 __init__() 的含义是把输入的值进行赋值即可(对创建的对象进行初始化)

# 博主:辰chen
# 博客地址:https://chen-ac.blog.csdn.net/
# 开发时间:2022/1/1 0:39
# 欢迎大家关注AIoT相关博客~
class Car:
    def __init__(self, brand):
        self.brand = brand
    def start(self):
        print('车启动了')
car = Car('Veneno')
print(car.brand)
car.start()

image.png

在Python中没有专门的修饰符用于属性的私有,如果该属性不希望在类对象外部被访问,前边使用两个_

# 博主:辰chen
# 博客地址:https://chen-ac.blog.csdn.net/
# 开发时间:2022/1/1 0:49
# 欢迎大家关注AIoT相关博客~
class Student:
    def __init__(self, name, age):
        self.name = name
        self.__age = age # 年龄不希望在外部被使用,所以加了两个_
    def show(self):
        print(self.name, self.__age)
stu = Student('辰chen', 19)
stu.show()
# 在类的外部使用 name 和 age
try:
    print(stu.__age)
except AttributeError as e:
    print(e)

image.png

现在有小淘气出来了:真的没有方法访问 age 了么?

其实还是有的,见下述代码:

❗️ 注:下面的代码使用了 __init__() 方法,后续会有讲解,读者这里只需要知道 __init__() 的含义是把输入的值进行赋值即可(对创建的对象进行初始化)

# 博主:辰chen
# 博客地址:https://chen-ac.blog.csdn.net/
# 开发时间:2022/1/1 0:49
# 欢迎大家关注AIoT相关博客~
class Student:
    def __init__(self, name, age):
        self.name = name
        self.__age = age # 年龄不希望在外部被使用,所以加了两个_
    def show(self):
        print(self.name, self.__age)
stu = Student('辰chen', 19)
stu.show()
# 在类的外部使用 name 和 age
try:
    print(stu.__age)
except AttributeError as e:
    print(e)
# 在类的外部可以通过 _Student__age进行访问(不推荐!!!)
print(stu._Student__age)

image.png

4.3 继承

🚩我们通过一张图来介绍父类和子类:

image.png

上面的图中,我们可以说动物是爬行动物和哺乳动物的父类,即爬行动物和哺乳动物是动物的子类;鳄鱼、蛇的父类是爬行动物,爬行动物的子类是鳄鱼和蛇;老虎、猴子、狼的父类是哺乳动物,哺乳动物的子类为老虎、猴子、狼。

不难看出,父类中拥有一些性质是子类中所共有的,所以我们在定义子类的时候就不必写的那么麻烦,只需要从父类那边继承即可。

Python 中可以单继承,也可以多继承,其语法格式为:

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

如果一个类没有继承任何类,则默认继承object,比如我们之前学习中的代码其实就是默认继承 object。

定义子类时,必须在其构造函数中调用父类的构造函数。

❗️ 注:下面的代码使用了 __init__() 方法,后续会有讲解,读者这里只需要知道 __init__() 的含义是把输入的值进行赋值即可(对创建的对象进行初始化)

# 博主:辰chen
# 博客地址:https://chen-ac.blog.csdn.net/
# 开发时间:2022/1/1 1:28
# 欢迎大家关注AIoT相关博客~
class Person(object):
    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, stuNum):
        self.name = name
        self.age = age
        self.stuNum = stuNum
class Teacher(Person):
    def __init__(self, name, age, teaNum):
        self.name = name
        self.age = age
        self.teaNum = teaNum
stu = Student('辰chen', 19, '171519')
stu.info()
tea = Teacher('晶姐', 30, '52519')
tea.info()

image.png

下面简单介绍多继承:

# 博主:辰chen
# 博客地址:https://chen-ac.blog.csdn.net/
# 开发时间:2022/1/1 1:49
# 欢迎大家关注AIoT相关博客~
class A(object):
    pass
class B(object):
    pass
class C(A, B): # C 有两个父类: A 和 B
    pass

4.4 方法重写

🚩所谓方法重写其实就是当我们父类的某个属性或方法无法满足我们子类的需求,我们可以在子类中对其(方法体)进行重新编写,例如我们在 4.3 继承 中单继承的例子,我们在 Person 类中定义的 info 方法只能输出名字和年龄,但是学生和老师都有属于自己的学生编号和教职工编号,这些属性是子类中所特有的,但我们在调用子类中继承父类中的 info 方法时发现只能输出姓名和年龄,这不是我们想要的我,针对以上这种情况我们就可以使用方法重写。对于方法重写就是在子类中定义一个和父类中相同名称的函数体(可理解为覆盖)。

image.png

如上图所示,当你在子类中重写方法时在PyCharm中会有提示。

❗️ 注:下面的代码使用了 __init__() 方法,后续会有讲解,读者这里只需要知道 __init__() 的含义是把输入的值进行赋值即可(对创建的对象进行初始化)

# 博主:辰chen
# 博客地址:https://chen-ac.blog.csdn.net/
# 开发时间:2022/1/1 8:28
# 欢迎大家关注AIoT相关博客~
class Person(object):
    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, stuNum):
        self.name = name
        self.age = age
        self.stuNum = stuNum
    def info(self):
        print(self.stuNum)
class Teacher(Person):
    def __init__(self, name, age, teaNum):
        self.name = name
        self.age = age
        self.teaNum = teaNum
    def info(self):
        print(self.teaNum)
stu = Student('辰chen', 19, '171519')
stu.info()
tea = Teacher('晶姐', 30, '52519')
tea.info()

image.png

哎,问题又来了,我们成功输出了学号和教师编号,但是姓名和年龄却没有了,这就是我上面说过的覆盖,可以简单的理解成子类和父类同时定义了一个方法体,我们在实例化对象对方法进行调用的时候,优先调用子类的方法,我们如果想把输出姓名,年龄,编号都输出,当然可以在子类的方法中写成:

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

但这显然是不够简洁美观的,我们父类中的方法消失了么?其实并没有消失,我们只不过是优先调用了子类的方法。我们可以用super().xxx()去调用父类中被重写的方法。这样可以精简我们的代码:

❗️ 注:下面的代码使用了 __init__() 方法,后续会有讲解,读者这里只需要知道 __init__() 的含义是把输入的值进行赋值即可(对创建的对象进行初始化)

# 博主:辰chen
# 博客地址:https://chen-ac.blog.csdn.net/
# 开发时间:2022/1/1 8:28
# 欢迎大家关注AIoT相关博客~
class Person(object):
    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, stuNum):
        self.name = name
        self.age = age
        self.stuNum = stuNum
    def info(self):
        super().info()
        print(self.stuNum)
class Teacher(Person):
    def __init__(self, name, age, teaNum):
        self.name = name
        self.age = age
        self.teaNum = teaNum
    def info(self):
        super().info()
        print(self.teaNum)
stu = Student('辰chen', 19, '171519')
stu.info()
tea = Teacher('晶姐', 30, '52519')
tea.info()

image.png

显然,父类中有 __init__() 方法,可以传入姓名和年龄两个参数,子类中也有 __init()__ 方法,这其实就是在重写父类中的方法,我们同样可以按照上述去调用父类中的 __init__() 方法,从而可以精简我们的代码:

❗️ 注:下面的代码使用了 __init__() 方法,后续会有讲解,读者这里只需要知道 __init__() 的含义是把输入的值进行赋值即可(对创建的对象进行初始化)

# 博主:辰chen
# 博客地址:https://chen-ac.blog.csdn.net/
# 开发时间:2022/1/1 8:28
# 欢迎大家关注AIoT相关博客~
class Person(object):
    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, stuNum):
        super().__init__(name, age)
        self.stuNum = stuNum
    def info(self):
        super().info()
        print(self.stuNum)
class Teacher(Person):
    def __init__(self, name, age, teaNum):
        super().__init__(name, age)
        self.teaNum = teaNum
    def info(self):
        super().info()
        print(self.teaNum)
stu = Student('辰chen', 19, '171519')
stu.info()
tea = Teacher('晶姐', 30, '52519')
tea.info()

image.png




目录
相关文章
|
28天前
|
IDE 数据挖掘 开发工具
Python作为一种广受欢迎的高级编程语言,以其简洁的语法和强大的功能吸引了众多初学者和专业开发者
Python作为一种广受欢迎的高级编程语言,以其简洁的语法和强大的功能吸引了众多初学者和专业开发者
36 7
|
4天前
|
存储 数据处理 Python
Python如何显示对象的某个属性的所有值
本文介绍了如何在Python中使用`getattr`和`hasattr`函数来访问和检查对象的属性。通过这些工具,可以轻松遍历对象列表并提取特定属性的所有值,适用于数据处理和分析任务。示例包括获取对象列表中所有书籍的作者和检查动物对象的名称属性。
15 2
|
18天前
|
关系型数据库 开发者 Python
Python编程中的面向对象设计原则####
在本文中,我们将探讨Python编程中的面向对象设计原则。面向对象编程(OOP)是一种通过使用“对象”和“类”的概念来组织代码的方法。我们将介绍SOLID原则,包括单一职责原则、开放/封闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则有助于提高代码的可读性、可维护性和可扩展性。 ####
|
18天前
|
缓存 监控 算法
Python内存管理:掌握对象的生命周期与垃圾回收机制####
本文深入探讨了Python中的内存管理机制,特别是对象的生命周期和垃圾回收过程。通过理解引用计数、标记-清除及分代收集等核心概念,帮助开发者优化程序性能,避免内存泄漏。 ####
30 3
|
26天前
|
存储 索引 Python
Python 的基本语法
这些是 Python 的基本语法要素,掌握它们是学习和使用 Python 的基础。通过不断地实践和应用,你将能够更深入地理解和熟练运用这些语法知识,从而编写出高效、简洁的 Python 代码
56 5
|
29天前
|
存储 Python
Python编程入门:理解基础语法与编写简单程序
本文旨在为初学者提供一个关于如何开始使用Python编程语言的指南。我们将从安装Python环境开始,逐步介绍变量、数据类型、控制结构、函数和模块等基本概念。通过实例演示和练习,读者将学会如何编写简单的Python程序,并了解如何解决常见的编程问题。文章最后将提供一些资源,以供进一步学习和实践。
32 1
|
1月前
|
机器学习/深度学习 数据挖掘 开发者
Python编程入门:理解基础语法与编写第一个程序
【10月更文挑战第37天】本文旨在为初学者提供Python编程的初步了解,通过简明的语言和直观的例子,引导读者掌握Python的基础语法,并完成一个简单的程序。我们将从变量、数据类型到控制结构,逐步展开讲解,确保即使是编程新手也能轻松跟上。文章末尾附有完整代码示例,供读者参考和实践。
|
17天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
16天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
4天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
98 80
下一篇
DataWorks