面向对象编程(OOP):理解类、封装性的关键概念

2023-11-08

对象(Object)

什么是对象?

对象是内存中专门用来存储数据的一块区域。对象中可以存放各种数据,比如数字、布尔值、代码。对象由三部分组成:

  1. 对象的标识(id)
  2. 对象的类型(type)
  3. 对象的值(value)

面向对象(OOP)

Python是一门面向对象的编程语言。所谓的面向对象的语言,简单理解就是语言中的所有操作都是通过对象来进行的。

面向过程的编程语言

面向过程指将我们的程序的逻辑分解为一个一个的步骤,通过对每个步骤的抽象,来完成程序。例如,孩子上学的过程可以拆分为多个步骤:

  1. 妈妈起床
  2. 妈妈上厕所
  3. 妈妈洗漱
  4. 妈妈做早饭
  5. 妈妈叫孩子起床
  6. 孩子上厕所
  7. 孩子要洗漱
  8. 孩子吃饭
  9. 孩子背着书包上学校

面向过程的编程思想将一个功能分解为一个一个小的步骤,通过完成一个一个小的步骤来完成一个程序。这种编程方式比较简单,符合人类的思维。但是它的可复用性低,并且难于维护。

面向对象的编程语言

面向对象的编程语言关注的是对象,而不关注过程。对于面向对象的语言来说,一切都是对象。例如,孩他妈起床叫孩子上学。

面向对象的编程思想将所有的功能统一保存到对应的对象中,要使用某个功能,直接找到对应的对象即可。这种方式编写的代码容易阅读、易于维护,也容易复用。但是这种方式编写起来稍微麻烦一点,不太符合常规的思维。

综上所述,面向对象的编程思想主要包括两步:

  1. 找对象
  2. 搞对象

类(class)

在Python中,我们可以使用内置对象 (如int, float, str等) 来创建对象。但是,不能满足所有的需求,因此我们经常需要自定义一些对象。简单地说,类就相当于一个图纸。我们在程序中需要根据类来创建对象。也有人称对象是类的实例(instance)。如果多个对象是通过一个类创建的,我们称这些对象是一类对象,就像 int()、float()、bool()、str()、list()、dict() 之类的对象一样。在定义自己的类时,需要使用大写字母开头,使用大驼峰命名法(帕斯卡命名法)来对类命名。

#定义一个简单的类
class MyClass():
    pass

mc = MyClass()

使用类创建对象的流程

使用类来创建对象,就像调用一个函数一样。它的流程如下:

1.创建一个变量

2.在内存中创建一个新对象

3.将对象的id赋值给变量

类的定义

实际上,类和对象都是对现实生活中的事物或程序中的内容的抽象。在类的代码块中,我们可以定义变量和函数。变量会成为该类实例的公共属性,所有该类实例都可以通过 对象.属性名 的形式访问。函数会成为该类实例的公共方法,所有该类实例都可以通过 对象.方法名() 的形式调用方法。在定义方法时,至少要定义一个形参。方法调用时,解析器会先在当前对象中寻找是否含有该属性或方法,如果没有,则去当前对象的类对象中去寻找。如果类对象中依然没有,则报错。

#定义一个简单的人类
class Person :
    name = 'swk' # 公共属性,所有实例都可以访问

    def say_hello(self) :
        print('你好!我是 %s' %self.name)
        
p1 = Person()
p2 = Person()

p1.name = '猪八戒'

p1.say_hello() # '你好!我是 猪八戒'
p2.say_hello() # '你好!我是 swk'

代码演示

#定义一个简单的类
class MyClass():
    pass

#使用MyClass创建一个对象
mc = MyClass() # mc就是通过MyClass创建的对象,mc是MyClass的实例
mc_2 = MyClass()
mc_3 = MyClass()
mc_4 = MyClass()

# isinstance()用来检查一个对象是否是一个类的实例
result = isinstance(mc_2,MyClass)

#现在我们通过MyClass这个类创建的对象都是一个空对象
#也就是对象中实际上什么都没有,就相当于是一个空的盒子
#可以向对象中添加变量,对象中的变量称为属性
#语法:对象.属性名 = 属性值
mc.name = '孙悟空'
mc_2.name = '猪八戒'

print(mc_2.name)

#定义一个简单的人类
class Person :
    name = 'swk' # 公共属性,所有实例都可以访问

    def say_hello(self) :
        print('你好!我是 %s' %self.name)
        
p1 = Person()
p2 = Person()

p1.name = '猪八戒'

p1.say_hello() # '你好!我是 猪八戒'
p2.say_hello() # '你好!我是 swk'

初始化方法和实例属性

在类中,我们可以定义一个特殊的方法,称为初始化方法(init),它会在创建一个对象时自动调用。初始化方法可以接受参数,并将这些参数赋值给对象的属性。通过这种方式,我们可以为每个对象设置不同的初始值。

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

    def say_hello(self):
        print(f"你好!我是{self.name},今年{self.age}岁。")

在上面的代码中,我们定义了一个Person类,它有两个实例属性:nameage。初始化方法接受两个参数,并将它们分别赋值给对象的属性。通过创建对象并调用say_hello方法,我们可以访问和修改这些属性。

类属性和类方法

除了实例属性和实例方法,类还可以有类属性和类方法。

类属性是属于类本身的属性,而不是属于实例的属性。所有该类的实例都可以访问和修改类属性。

class Person:
    count = 0  # 类属性

    def __init__(self, name):
        self.name = name
        Person.count += 1  # 每创建一个实例,count加1

    @classmethod
    def get_count(cls):
        return cls.count  # 使用cls访问类属性

在上面的代码中,我们定义了一个count类属性,它记录了创建的实例个数。每当创建一个实例时,通过初始化方法将类属性count加1。通过类方法get_count(),我们可以获取到目前创建的实例个数。

继承和多态

Python中的类还支持继承,一个类可以从另一个类继承属性和方法。子类可以重写父类的方法,实现多态的效果。

class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        print(f"{self.name}汪汪叫")

class Cat(Animal):
    def speak(self):
        print(f"{self.name}喵喵叫")

在上面的代码中,我们定义了一个Animal类,它有一个speak方法。然后,我们定义了DogCat两个子类分别继承Animal类。子类可以重写父类的方法,这就是多态的一种体现。通过创建DogCat对象,我们可以调用它们各自的speak方法。

魔术方法

除了初始化方法(init)之外,Python中还有许多特殊方法,也被称为魔术方法(magic methods)。这些特殊方法以双下划线开头和结尾,它们在特定的时刻自动调用。

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

    def __str__(self):
        return f"Person对象:{self.name}"

    def __eq__(self, other):
        return self.name == other.name

在上面的代码中,我们定义了两个魔术方法:__str____eq__

  • __str__方法用于定义对象的字符串表示。当调用print函数或使用str()函数时,会自动调用该方法并返回一个字符串表示。
  • __eq__方法用于定义对象的相等性。它接受另一个对象作为参数,并根据自定义的逻辑判断两个对象是否相等。

通过实现这些魔术方法,我们可以更好地控制对象的行为,并使其更符合我们的预期。

小结

在本章中,我们介绍了Python类的基本概念和用法。从初始化方法到实例属性、类属性、类方法、继承和多态,我们一步步深入了解了类的各种特性和用法。同时,我们还了解了魔术方法的作用和用法,可以通过实现这些方法来定制类的行为。

类的封装性

在面向对象的编程中,封装是一种重要的概念。它指的是将数据和方法组合成一个单一的实体,并对外部隐藏具体的实现细节。

Python中的类提供了封装的机制。我们可以使用访问修饰符来控制属性和方法的可访问性。

  • 公有访问修饰符:没有使用任何修饰符,所有属性和方法默认为公有。公有属性和方法可以在类内部和外部访问。
  • 私有访问修饰符:使用双下划线(__)作为前缀来定义私有属性和方法。私有属性和方法只能在类内部访问,无法在类外部直接访问。
class Person:
    def __init__(self, name):
        self.__name = name  # 私有属性

    def __say_hello(self):  # 私有方法
        print(f"你好!我是{self.__name}。")

    def greet(self):
        self.__say_hello()

在上面的代码中,namesay_hello都是私有成员。使用双下划线作为前缀可以定义私有属性和方法。在类的内部,我们可以直接访问这些私有成员。而在类的外部,无法直接访问私有成员,但可以通过公有方法间接访问。

属性的访问器和设置器

除了直接访问属性,我们还可以使用属性访问器(getter)和属性设置器(setter)来控制对属性的访问和修改。

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

    @property
    def name(self):  # 属性访问器
        return self.__name

    @name.setter
    def name(self, value):  # 属性设置器
        if isinstance(value, str):
            self.__name = value
        else:
            raise ValueError("姓名必须是字符串类型")

在上面的代码中,我们使用@property装饰器定义了一个属性访问器,名为name()。通过访问obj.name,我们可以获取私有属性__name的值。然后,我们使用@name.setter装饰器定义了一个属性设置器,名也为name()。通过赋值obj.name = value,我们可以修改私有属性__name的值。

这样做的好处是,在外部使用对象属性时,我们可以像访问普通属性一样,而无需直接访问私有属性。

小结

在本文中,我们介绍了Python类的封装性和属性访问控制。通过使用访问修饰符、私有属性和方法,我们可以隐藏类的具体实现细节,并提供公有接口供外部使用。我们还学习了如何使用属性访问器和设置器来控制对属性的访问和修改。

总结

本文介绍了面向对象编程中的一些重要概念和技术,包括对象、类、继承、多态、魔术方法等。通过使用类和对象,我们可以将数据和方法组合成一个单一的实体,实现代码的封装和复用。

在面向过程的编程语言中,主要关注程序的过程和函数。而在面向对象的编程语言中,我们将程序分解成一个个的对象,每个对象都有自己的数据和方法。这种方式更加灵活和易于理解。

类是对象的模板,通过定义类可以创建出多个实例对象。类由属性和方法组成,属性存储对象的数据,方法定义对象的行为。

初始化方法和实例属性用于在创建对象时初始化对象的状态。类属性是所有实例共享的属性,类方法是作用于整个类而非单个实例的方法。

继承和多态是面向对象编程中的两个重要概念。通过继承,我们可以创建新的类并从现有的类继承属性和方法。多态允许不同的对象对相同的方法进行不同的实现,提高了代码的灵活性和可扩展性。

魔术方法是Python中特殊命名的方法,用于实现特定的功能或行为,如初始化、比较、运算符重载等。

此外,本文还介绍了类的封装性和属性的访问控制。通过使用访问修饰符、私有属性和方法,可以隐藏类的具体实现细节,并提供公有接口供外部使用。属性访问器和设置器可以控制对属性的访问和修改,增加了代码的安全性和可维护性。

总而言之,面向对象编程是一种强大的编程范式,通过将程序分解成对象的方式,可以实现代码的模块化、复用和灵活性。掌握类的定义、继承、多态、魔术方法等概念和技术,能够编写出更加结构化和可扩展的代码。

python精品专栏推荐


python基础知识(0基础入门)

【python基础知识】0.print()函数
【python基础知识】1.数据类型、数据应用、数据转换
【python基础知识】2.if条件判断与条件嵌套
【python基础知识】3.input()函数
【python基础知识】4.列表和字典
【python基础知识】5.for循环和while循环
【python基础知识】6.布尔值和四种语句(break、continue、pass、else)
【python基础知识】7.实操-用Python实现“文字PK”小游戏(一)
【python基础知识】7.实操-用Python实现“文字PK”小游戏(二)
【python基础知识】8.编程思维:如何解决问题-思维篇
【python基础知识】9.函数的定义和调用
【python基础知识】10.用函数编写程序 - 实操篇
【python基础知识】10.用Python实现石头剪刀布小游戏-函数实操篇
【python基础知识】11.如何debug -常见报错原因及排查思路 - 思维篇
【python基础知识】12.类与对象(一)
【python基础知识】12.类与对象(二)
【python基础知识】13.类与对象(三)
【python基础知识】13.类与对象(四)
【python基础知识】14.图书管理系统的搭建(类与对象实操)
【python基础知识】15.编码基础知识
【python基础知识】16.文件读写基础及操作
【python基础知识】16.“古诗默写题”的python实现(文件读写和编码-实操篇)
【python基础知识】17.模块的概念以及如何引入
【python基础知识】18.实操-使用python自动群发邮件
【python基础知识】19.产品思维以及流程图的使用 - 思维篇
【python基础知识】20.“午饭吃什么”的python实现(产品思维-实操篇)
【python基础知识】21.高效偷懒的正确打开方式-毕业篇
【python文件处理】CSV文件的读取、处理、写入
【python文件处理】Excel自动处理(使用 openpyxl)
【python文件处理】-excel格式处理


python爬虫知识

【python爬虫】1.爬虫基础知识
【python爬虫】2.网页基础知识
【python爬虫】3.爬虫初体验(BeautifulSoup解析)
【python爬虫】4.爬虫实操(菜品爬取)
【python爬虫】5.爬虫实操(歌词爬取)
【python爬虫】6.爬虫实操(带参数请求数据)
【python爬虫】7.爬到的数据存到哪里?
【python爬虫】8.温故而知新
【python爬虫】9.带着小饼干登录(cookies)
【python爬虫】10.指挥浏览器自动工作(selenium)
【python爬虫】11.让爬虫按时向你汇报
【python爬虫】12.建立你的爬虫大军
【python爬虫】13.吃什么不会胖(爬虫实操练习)
【python爬虫】14.Scrapy框架讲解
【python爬虫】15.Scrapy框架实战(热门职位爬取)
【python爬虫】16.爬虫知识点总结复习

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面向对象编程(OOP):理解类、封装性的关键概念 的相关文章

  • Python 中的舍入浮点问题

    我遇到了 np round np around 的问题 它没有正确舍入 我无法包含代码 因为当我手动设置值 而不是使用我的数据 时 返回有效 但这是输出 In 177 a Out 177 0 0099999998 In 178 np rou
  • 用枢轴点拟合曲线 Python

    我有下面的图 我想用 2 条线来拟合它 使用 python 我设法适应上半部分 def func x a b x np array x return a x b popt pcov curve fit func up x up y 我想用另
  • 需要在python中找到print或printf的源代码[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在做一些我不能完全谈论的事情 我
  • 跟踪 pypi 依赖项 - 谁在使用我的包

    无论如何 是否可以通过 pip 或 PyPi 来识别哪些项目 在 Pypi 上发布 可能正在使用我的包 也在 PyPi 上发布 我想确定每个包的用户群以及可能尝试积极与他们互动 预先感谢您的任何答案 即使我想做的事情是不可能的 这实际上是不
  • Pandas 日期时间格式

    是否可以用零后缀表示 pd to datetime 似乎零被删除了 print pd to datetime 2000 07 26 14 21 00 00000 format Y m d H M S f 结果是 2000 07 26 14
  • 使用 kivy textinput 的 'input_type' 属性的问题

    您好 我在使用 kivy 的文本输入小部件的 input type 属性时遇到问题 问题是我制作了两个自定义文本输入 其中一个称为 StrText 其中设置了 input type text 然后是第二个文本输入 名为 NumText 其
  • Android 时钟滴答数 [赫兹]

    关于 proc pid stat 中应用程序的总 CPU 使用率 https stackoverflow com questions 16726779 total cpu usage of an application from proc
  • 独立滚动矩阵的行

    我有一个矩阵 准确地说 是 2d numpy ndarray A np array 4 0 0 1 2 3 0 0 5 我想滚动每一行A根据另一个数组中的滚动值独立地 r np array 2 0 1 也就是说 我想这样做 print np
  • 使用Python请求登录Google帐户

    在多个登录页面上 需要谷歌登录才能继续 我想用requestspython 中的库以便让我自己登录 通常这很容易使用requests库 但是我无法让它工作 我不确定这是否是由于 Google 做出的一些限制 也许我需要使用他们的 API 或
  • 使用字典映射数据帧索引

    为什么不df index map dict 工作就像df column name map dict 这是尝试使用index map的一个小例子 import pandas as pd df pd DataFrame one A 10 B 2
  • YOLOv8获取预测边界框

    我想将 OpenCV 与 YOLOv8 集成ultralytics 所以我想从模型预测中获取边界框坐标 我该怎么做呢 from ultralytics import YOLO import cv2 model YOLO yolov8n pt
  • 在Python中连接反斜杠

    我是 python 新手 所以如果这听起来很简单 请原谅我 我想加入一些变量来生成一条路径 像这样 AAAABBBBCCCC 2 2014 04 2014 04 01 csv Id TypeOfMachine year month year
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 从 NumPy ndarray 中选择行

    我只想从 a 中选择某些行NumPy http en wikipedia org wiki NumPy基于第二列中的值的数组 例如 此测试数组的第二列包含从 1 到 10 的整数 gt gt gt test numpy array nump
  • 仅第一个加载的 Django 站点有效

    我最近向 stackoverflow 提交了一个问题 标题为使用mod wsgi在apache上多次请求后Django无限加载 https stackoverflow com questions 71705909 django infini
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • 如何应用一个函数 n 次? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 假设我有一个函数 它接受一个参数并返回相同类型的结果 def increment x return x 1 如何制作高阶函数repeat可以
  • Pandas 每周计算重复值

    我有一个Dataframe包含按周分组的日期和 ID df date id 2022 02 07 1 3 5 4 2022 02 14 2 1 3 2022 02 21 9 10 1 2022 05 16 我想计算每周有多少 id 与上周重
  • 更改 Tk 标签小部件中单个单词的颜色

    我想更改 Tkinter 标签小部件中单个单词的字体颜色 我知道可以使用文本小部件来实现与我想要完成的类似的事情 例如使单词 YELLOW 显示为黄色 self text tag config tag yel fg clr yellow s

随机推荐

  • 键盘的测试点

  • ajax tottenham,Tottenham end Ajax dream in injury-time, reach first Champions League final

    Video PlayerClose AMSTERDAM May 9 Xinhua Tottenham Hotspur set up a Champions League final against Liverpool after beati
  • Netty介绍(一)————为什么使用Netty

    Netty的简单介绍 Netty 是一个 NIO client server 客户端服务器 框架 使用 Netty 可以快速开发网络应用 例如服务器和客户 端协议 Netty 提供了一种新的方式来使开发网络应用程序 这种新的方式使得它很容易
  • 记一次arm交叉编译的cmake写法

    1 背景 用cmake交叉编译高通4G模组Linux应用代码 2 问题 之前都是参考网上各种所谓的cmake交叉编译写法 例如某乎上config cmake是这样写的 set CMAKE SYSTEM NAME Linux set TOOL
  • vue2的文档

    三 Vue 2 1 Vue 基础 1 环境准备 安装脚手架 npm install g vue cli g 参数表示全局安装 这样在任意目录都可以使用 vue 脚本创建项目 创建项目 vue ui 使用图形向导来创建 vue 项目 如下图
  • C 修改文件或文件夹的权限,为指定用户 用户组添加完全控制权限

    分享一下我老师大神的人工智能教程 零基础 通俗易懂 http blog csdn net jiangjunshow 也欢迎大家转载本篇文章 分享知识 造福人民 实现我们中华民族伟大复兴 C 修改文件或文件夹的权限 为指定用户 用户组添加完全
  • 阿里一道Java并发面试题 (详细分析篇)

    说明 前天分享了一篇关于阿里的 Java常见疑惑和陷阱 的文章 有人说这个很早就有了 可能我才注意到 看完之后发现内容非常不错 有几个我也是需要停顿下想想 题目 我个人一直认为 网络 并发相关的知识 相对其他一些编程知识点更难一些 主要是不
  • Dingo + Laravel + JWT + Entrust + memcache 实现API设计

    Dingo Laravel JWT Entrust memcache 实现API设计 Dingo Api 是一个为laravel设计的用于API开发的开源包 规范和简化了Api的设计 JWT 即 Json Web Token 是一种新的用于
  • 将类模板做为参数(类模板中使用)

    将类模板做为参数 类模板中使用 这种方式只在类模板中使用 函数模板不能使用这种方法 将模板名做为一种特殊的数据类型 实例化对象的时候 使用模板名做为参数 传递给模板 下面例子中 数组和链表都是线性表 数组和链表自身为了适用不同的数据类型参数
  • 代理IP与Socks5代理:跨界电商智能爬虫与出海之道

    跨界电商正成为全球市场的关键驱动力 而代理IP和Socks5代理则为其提供了技术支持 本文将深入研究这两种代理技术在跨界电商 爬虫和出海战略中的重要作用 引言 介绍跨界电商的崛起和全球化趋势 引出代理IP和Socks5代理的重要性以及本文的
  • 魔兽争霸3宽屏显示器适配

    魔兽争霸只提供 4 3 的分辨率选择 800 600 1024 768 等等 如果显示器是 16 9 或 16 10 的话就有点儿蛋疼了 两边都会留出黑边来 可以在 windows 下面双击执行如下的文件来解决这个问题 wide scree
  • Atcoder Beginner Contest 291

    A camel Case AC代码 include
  • 屏蔽预训练模型的权重。 只训练最后一层的全连接的权重。_Soft-Masked BERT 一种新的中文纠错模型...

    今年 字节AI Lab与复旦大学合作提出了一种中文文本纠错模型 Soft Masked BERT 1 这项工作发表在了ACL 2020上 由于论文并没有开源代码 所以我将对这篇论文进行解读与复现 问题提出 中文文本纠错是一项挑战性的任务 因
  • Python pandas 排序出现'DataFrame' object has no attribute 'sort'错误

    目标 对dataframe一列时间字符串做升序排列 时间字符串格式 2020 03 23 06 20 00 00 00 df sort MTS ascending True 运行提示 AttributeError DataFrame obj
  • CNN训练细节:卷积核分解

    背景 最近看到一些分解卷积层的方法 比如三个3 3的卷积层替代一个7 7的卷积层 或者两个3乘3的卷积层替代一个5 5的卷积层 本文主要是个人粗浅的分析下原因 一 两个3乘3的卷积层替代一个5 5的卷积层 经典原理网图 如图所示 对于两层3
  • 蓝桥杯校内模拟赛题解

    蓝桥杯校内模拟赛题解 引言 本题解非官方满分题解 因此 可能存在下列问题 题意理解错误 导致答案错误 代码中存在一些问题 导致答案错误 算法复杂度的分析有误 导致不能在规定时间内得出结果 由于水平受限 本篇题解全部由 C 语言完成 题解中的
  • 自我管理的重要模型

    文章目录 前言 一 精力管理 自我管理的新旧理念 二 人类精力金字塔 精力管理四个层次 体能 情绪 思维 精神 三 运动 人类为什么喜欢躺平 每天怎么简单高效的完成20分钟的运动量 四 钟摆运动 钟摆运动对工作最大的指导意义 刻意休息 在这
  • Java 到 Go 过渡:基于 Go 开发分布式配置中心的实践

    目录 一 简介 二 Java 实现 三 Go 实现 四 从 Java 过渡到 Go 五 总结 在今天的技术世界中 从一种编程语言转向另一种是很常见的 特别是对于在企业级应用中具有广泛应用的语言如 Java 转向轻量级 效率更高的 Go 语言
  • 【因果学习】贝叶斯网络结构学习方法

    随机对照试验是发现因果关系的黄金准则 然而现实世界中很多问题往往由于道德伦理的原因不允许我们设置干预进行试验 这就引发了在观测数据上学习因果关系的需求 贝叶斯网络是概率论与图论相结合的产物 它用图论的方式直观地表达各变量之间的因果关系 为多
  • 面向对象编程(OOP):理解类、封装性的关键概念

    文章目录 对象 Object 什么是对象 面向对象 OOP 面向过程的编程语言 面向对象的编程语言 类 class 使用类创建对象的流程 类的定义 代码演示 初始化方法和实例属性 类属性和类方法 继承和多态 魔术方法 小结 类的封装性 属性