盘一盘 Python 系列特别篇 - 面向对象编程

本文含 14123 字,53 图表截屏

建议阅读 72 分钟

0

引言

在写 Keras (下) 时,发现很多内容都要用到 (class) 和对象 (object),因此本文作为 Python 系列的特别篇,主要介绍面向对象编程 (Object-Oriented Programming, OOP)。

如果只用一句话来区分 Python 和其它编程语言,那就是

万物皆对象。

那我再加唐突的加一句废话。

万物可分为若干类。

抖了这么多包袱,请注意上面两句话提到了两个词,对象

类 (class) 是对某一类事物的描述,是抽象的;而对象 (object) 是类的一个实例,是具体的。比如:

  • 「人」是类,而「运动员」则是「人」的一个实例。

  • 「车」是类,而「轿车」则是「车」的一个实例。

  • 「金融产品」是类,而「外汇期权」则是「金融产品」的一个实例。

还记得之前介绍的变量 (variables) 和函数 (functions) 吗?它们是零散的,而对象将它们集合起来,

  • 在对象里也有变量,用来存储数据,这时变量又称字段 (fields)

  • 在对象里也有函数,用来操作数据,这时函数又称方法 (methods)

字段方法统称为类的属性 (attributes)。

很抽象对不对?我故意的,这样你们才想往下看,或者点右上角的叉。

本帖的讲述逻辑如下:

  • 第一章先用 Python 里面内置的 int, list, ndarray 和 dataframe 变量举例,感受一下 Python 中万物皆对象,体会一下对象里的属性 (字段和方法)

  • 第二章详细介绍面向对象编程的细节,内容包括:实例变量、类变量、实例方法、类方法、静态方法、继承、多态、魔法方法、属性装饰器等。

本帖目录如下:

目录

第一章 - 对象初体验

    1.1 整型 int

    1.2 列表 list

    1.3 NumPy 数组 - ndarray

    1.4 Pandas 数据帧 - dataframe

第二章 - 面向对象编程

    2.1 极简类和对象

    2.2 __init__() 和 self

    2.3 类变量 (千人千面)

    2.4 类变量 (千人一面)

    2.5 类方法 + 静态方法

    2.6 其他构建函数

    2.7 继承和多态

    2.8 魔法方法

    2.9 属性装饰器

总结

1

对象初体验

读本小节你不需要有什么心理负担,担心不懂对象和类怎么办?本节不需要懂,只需要跟着我节奏走。当然你需要大概知道整型变量、列表变量、numpy 数组变量和 pandas 数据帧变量。

回想一下,原来你是不是称它们都是变量?但其实上它们有更「高级」的叫法:类或对象。

1.1

整型 - int

整数类和对象

首先定义一个整数,并赋值。

# int 对象i = 1031

在 C++ 和 Java 里,整数只是一个基础 (primitive) 类型,而在 Python 里,整数是一个,可以用来创建很多整数型对象

用 dir(i) 可以浏览到整数下的属性,侧面证明了 i 是对象 (注意基础变量下面是没有属性的)。

注意到属性以两种类型呈现

  • 一种就是普通的字符串,比如 numerator

  • 一种是字符串前带两个下划线后带两个下划线 (dunder),比如 __init__

我先不讲为什么,先注意到这个区别就可以了。

此外用 dir(int) 也能得到同样结果,侧面也证明了 int 是类。

再来看看 i 的类型,很显然应该是 int。

# int 的类型type(i)
int

这样我们脑海里应该复现这样的类比:

    类  :  对象

    int :  i

字段和方法

打印出对象 i 一个字段 numerator,注意字符串后面没有括号

# int 的 fieldsi.numerator
1031

打印出对象 i 一个方法 bit_length(),注意字符串后面有括号

# int 的 methodsi.bit_length()
11

我们知道用 dir() 可以帮助我们该怎么写具体的属性名称,但在使用它们时,我们怎么知道后面要不要加括号呢?一看 numerator 就不加,而 bit_length() 就需要加。

方法 1:试着不加括号和加括号,总有一个或报错,那么就用另外一个。

方法 2:把鼠标放在属性名称上,按 shift + tab 键,就会用提示出来。

注意 Signature 后面写的带括号呢,因此使用 bit_length 的时候要加括号。

魔法方法

首先看看整数对象的加法乘法

# int 的 +i + i
2062
# int 的 *i * 2
<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值