查看原文
其他

数据治理 | 带你学Python之面向对象编程基础

数据seminar 数据Seminar 2022-12-31

我们将在数据治理板块中推出一系列原创推文,帮助读者搭建一个完整的社科研究数据治理软硬件体系。该板块将涉及以下几个模块:

  1. 计算机基础知识

(1)社科研究软硬件体系搭建——虚拟化技术概述与实践

  1. 编程基础

(1)数据治理 | 带你学Python之 环境搭建与基础数据类型介绍篇

(2)数据治理 | 带你学Python之控制结构与函数

本期内容:数据治理 | 带你学Python之面向对象编程基础

  1. 数据采集
  2. 数据存储

(1)安装篇 数据治理 | 遇到海量数据stata卡死怎么办?这一数据处理利器要掌握

(2)管理篇 数据治理 | 多人协同处理数据担心不安全?学会这一招,轻松管理你的数据团队

(3)数据导入 数据治理 | “把大象装进冰箱的第二步”:海量微观数据如何“塞进”数据库?

  1. 数据清洗
  2. 数据实验室搭建

Part1什么是面向对象

面向对象——Object Oriented Programming,简称 OOPOOP 把对象当作一个程序的基本单元,一个对象包含了数据和操作数据的函数。面向对象的出现极大地提高了编程的效率。Python在设计之初就已经是一门面向对象的编程语言了,正因为如此,在Python中创建一个类和对象是很容易的。本小节将简单介绍 Python 的面向对象编程。

目前流行的编程思想有两种——面向过程和面向对象。两种开发思想各有长短。面向过程的思想简单来说就是当需要实现一个功能的时候,非常注重开发的步骤和过程,每一个步骤都需要亲力亲为。关注的是怎么做。而面向对象的思想则是当需要实现一个功能的时候,看重的并不是步骤和过程,而是关心谁来做

举个例子:快中午了,你需要做饭,做菜吃。

  • 面向过程:买菜,洗米,煮饭,洗菜,起锅烧油,放入葱姜蒜等,放入菜,翻炒,加调料,翻炒,饭菜出锅,吃饭,刷锅。

  • 面向对象:找个人,教他怎么买菜,做饭,做菜,刷锅等一系列操作。让这个人帮你做,你来吃。

这样的活,你只需要教这个人怎么做如何操作,以后每餐都有帮手帮你做,相当 Nice。

Part2面向对象重要术语

Python面向对象编程中,有一些概念需要大家掌握:

  • :对具有相同数据或者方法的一组对象的集合
  • 对象:对象是一个类的具体实例
  • 多态:一个函数有多种表现形式,调用一个方法有多种形式,但是表现出的方法是不一样的。
  • 继承:子项继承父项的某些功能,在程序中表现某种联系
  • 封装:把需要重用的函数或者功能封装,方便其他程序直接调用
  • 实例属性:一个对象就是一组属性的集合
  • 实例方法:所有存取或者更新对象某个实例一条或者多条属性函数的集合。
  • 类属性:属于一个类中所有对象的属性,
  • 类方法:那些无须特定的对象实例就能够工作的从属于类的函数。

暂时不完全明白没有关系,后续将会慢慢介绍。

Part3类和对象

面向对象编程有两个非常重要的概念:类和对象。

1

类,意同其名,是对一群具有相同特征或者行为的事物的一个统称,类是抽象的。在类里我们称特征为属性。称行为为方法。类其实就是由属性和方法组成的一个抽象概念。打个比方,厨师是就是一个类,我们说,一个会做菜,并以做菜为职业的人是厨师。那么,厨师的属性是:是人,方法是:做菜。我们可以说某人是厨师,但却不能说厨师是某人。类似的,交通工具,电子设备等具有相似内部状态和运行规律的实体的集合都是类。

2对象(实例)

刚才说到,类是一类实体的集合,而对象则与其相反,对象是具体存在的个体,也叫做实例。在编程世界中,对象是由类创建出来的一个具体存在。由哪一个类创建出来的对象,就拥有在哪一个类中定义的属性和方法。在实际应用里,应该先有类,在类里定义好属性和行为,再根据类来创建对象。

3类和对象的关系

类是模板,对象是根据类这个模板创建出来的,应该先有类,再有对象。使用同一个类,能够创建出很多对象。类中定义了什么属性和方法,对象中就有什么属性和方法。不同对象对应的属性值可能不同。

4类和对象实战

定义类

类由三个部分组成,类的名称,属性和方法。举个例子,人类是一个类,这个类的名称是“人”;属性有“身高”,“体重”等;方法有“做饭”,“吃饭”等。

在 Python 中,类的定义与函数的定义类似,所不同的是,类的定义是使用关键字 "class"。与函数定义相同的是,在定义类时也要使用缩进的形式,以表示缩进的语句属于该类。类的定义形式如下.

class <类名>:  # 形式 1
    <方法列表>

class <类名>():# 形式 2
    <方法列表>

与函数相同,在使用类之前必须先定义类。下面的代码定义了一个 human 类,并定义了相关的属性。

>>> class human():
        name = '人'  # 定义姓名属性
        sex = ' '    # 定义性别属性
        age = 0      # 定义年龄属性

在 Python 中也可以以类继承的方式定义类。通过类继承来定义类的基本形式如下。

class <类名>(父类名):
    <方法列表>

其中圆括号内的父类名就是要继承的类,object 是 Python 里所有类的最顶级父类。

例如下面将定义一个学生类,继承上面 human 类的属性。

>>> class student(human): 
        school = '1'  # 定义学校属性
        number = '2'  # 定义学号属性
        grade = '3'   # 定义成绩属性
        
>>> student.name
'人'

可以看到,student 类继承了 human 类之后,也拥有了 human 类的属性。

类定义之后也可以动态的修改类中的属性。例如:

>>> student.weight = '50kg'

>>> del student.number

>>> student.weight
'50kg'

>>> student.number
Traceback (most recent call last):
  File "<pyshell#152>", line 1, in <module>
    student.number
AttributeError: type object 'student' has no attribute 'number'

类中也可以调用实例函数和普通函数,例如:

# 定义厨师类,继承 human 类

>>> class Chef(human):

        # 定义薪资属性
        pay = 10000  
        
        # 定义实例函数
        def info(self,food:str):
            print('cooking ' + food)
           
        # 定义普通函数 
        def sleep(hours):
            print(f'睡了{hours}小时')

定义一个类时,往往伴随着类属性的创建,前面示范了如何简单地定义类的属性,在实际的应用中,可以使用更高效,规范地定义类的属性。在代码复杂度较高时,使用前面的动态绑定属性的方式创建对象,就不太好了。这时需要一个名称为“__init__” 的方法,这个特殊的方法被称为构造函数,主要用于创建对象并将对象的数据初始化。该方法可以没有参数(除 self 参数之外),也可以有参数。例如:

>>> class Cat(object):
        def __init__(self,name):
            self.name = name  # 使用输入参数 name 作为 名称属性
            self.breed= '中华田园猫'  # 定义品种属性
            print("init 被调用了")   # 一个被调用的标记
            
>>> Cat_1 = Cat('胖橘')
init 被调用了
>>> Cat_1.name
'胖橘'
>>> Cat_1.breed
'中华田园猫'    

实际上,即使在定义类的时候不主动定义__init__方法,系统也会隐式地调用它,但不会定义任何属性以及输出任何信息。

定义类时,实例函数和普通函数的区别在于实例函数的第一个参数是“self”,而普通函数则不是。

关于“self”,应当了解以下几点:

  • self 表示当前对象。
  • self 并不是一个关键字,其实可以是任意的标识符,为了表达代表的是当前对象自己,习惯用 self
  • 调用实例函数的时候,self 不需要手动传参,系统会自动传递当前的对象。
  • 哪个对象调用了方法,方法里的 self 指的就是谁。
  • 通过 self.属性名 可以访问到这个对象的属性。
  • 通过 self.方法名() 可以调用这个对象的方法。
  • 在类内部获取属性和实例方法,通过 self 获取;
  • 在类外部获取属性和实例方法,通过对象名获取。
  • 如果一个类有多个对象,每个对象的属性是各自保存的,都有各自独立的地址。但实例方法是所有对象共享的,只占用一份内存空间。类会通过 self 来判断是哪个对象调用了实例方法。

创建对象

Python 中,可以根据已经定义的类去创建一个或多个对象,创建对象的语法格式如下。

对象名1 = 类名()
对象名2 = 类名()
对象名3 = 类名()

使用前面定义好的 student 类创建一个对象。

>>> student_1 = student()  # student_1 就是一个实例对象
>>> print(student.age)
0
>>> print(student.school)
1

再使用前面定义的拥有函数的 Chef 类创建一个对象。

>>> Chef_1 = Chef()

# 对象调用实例方法
>>> Chef_1.info('egg')  
cooking egg

# 类调用普通方法
>>> Chef.sleep(8)  
睡了8小时

# 对象调用普通方法
>>> Chef_1.sleep(8)  
Traceback (most recent call last):
  File "<pyshell#162>", line 1, in <module>
    Chef_1.sleep(8)
TypeError: sleep() takes 1 positional argument but 2 were given

Part4面向对象的三大特性

面向对象具有三大典型特征——封装继承多态。本小节将尽可能通俗地介绍这三大特征。

5封装

封装是面向对象编程的一大特征,其思想就是将属性和方法等细节封装在一个抽象地类中,并将类隐藏起来,只对外提供一个访问地方式。使用类中的方法时,可以先使用类创建对象,再使用对象调用类中的方法。这种思想极大的提升了代码的复用性和可读性。

6继承

继承是一种定义新类的方式,新建的类可以继承一个或多个父类,新建的类叫做子类或派生类。这样做可以使子类继承父类的所有属性和方法,可以提高代码的复用性,逻辑上会更加清晰。

7多态

多态的应用场景一般是在父类和子类之间,子类通过重写父类的方法,使具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同功能的函数。这种特性可以提高代码的灵活性。

若您想更加深入地了解 Python 面向对象的知识,可以参考 Python 官方网站的详解[1]

Part5总结

本文我们介绍了面向对象编程的基础概念包括:

  1. 面向对象基础概念,包括类、对象、类的属性和方法等
  2. 如何定义一个类、如何定义类的属性、如何继承类
  3. 如何用类创建一个对象,如何通过对象调用类方法和属性

本文面向零基础的读者,因此仅介绍了面向对象的基础知识。

面向对象编程还有非常多高级的知识点,待大家在日后的学习工作过程中慢慢发掘。

参考资料

[1]

Python 面向对象的知识: https://www.python.org/about/gettingstarted/





星标⭐我们不迷路!
想要文章及时到,文末“在看”少不了!

点击搜索你感兴趣的内容吧


往期推荐


文章推荐 | 经典永流传:美国经济评论百年经典论文20篇(可下载)

数据资源 | 八大板块!数据公开下载渠道

统计计量 | p值是什么?数据科学家用最简单的方式告诉你

统计计量 | 文科生,如何有步骤地学好计量经济学?

数据可视化 | 给论文创建“图形”的10条法则

统计计量 | 实证研究的诀窍:因果识别!

数据治理 | 带你学Python之控制结构与函数






数据Seminar




这里是大数据、分析技术与学术研究的三叉路口


文 | 任正长


    欢迎扫描👇二维码添加关注    

点击下方“阅读全文”了解更多

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存