給 iOS 開發者的 python 學習日記十

写在前面

Python的基础语法在前段时间的穷追猛更后终于告一段落。今天来看看它的面向对象又有哪些奥秘呢?

标准的物件导向语言 Python。这里提供一个主观判断(Judgement call):习惯物件导向编程的资料科学初学者应该先学 Python。但这个主观判断仍旧不能广泛应用,因为这对于没有接触过任何一种类型编程的资料科学初学者来说毫无参考价值。

我们在开始讨论 Python 物件导向之前再看一个熟悉的例子,借此了解属性与方法是什么。

属性与方法

一个物件(Object)可以包含属性(Attribute)与方法(Method),我们示范的物件是一个 data frame 叫做 ironmen_df,她有 dtypes 属性与 head() 方法。

import pandas as pd # 引用套件並縮寫為 pd

groups = ["Modern Web", "DevOps", "Cloud", "Big Data", "Security", "自我挑戰組"]

ironmen = [54, 8, 18, 14, 6, 65]

ironmen_dict = {"groups": groups,

"ironmen": ironmen

}

ironmen_df = pd.DataFrame(ironmen_dict)

print(ironmen_df.dtypes) # ironmen_df 有 dtypes 屬性

ironmen_df.head(n = 3) # ironmen_df 有 head() 方法

Python 的面向对象

定义类别(Class)

我们使用 class 语法来定义类别,并使用大写开头(Capitalized)单字为类别命名,如果对于_init_方法与 self 参数感到困惑,就先记得这是一个特殊的 Python 方法,它用来帮助我们创造属于这个类别的物件。

class Ironmen:

'''這是一個叫做 Ironmen 的類別''' # Doc string

def __init__(self, group, participants):

self.group = group

self.participants = participants

print(Ironmen)

根据类别建立对象(Object)

一但类别 Ironmen 被定义完成,就可以使用 Ironmen() 当作建构子(Constructor)建立对象。

class Ironmen:

'''這是一個叫做 Ironmen 的類別''' # Doc string

def __init__(self, group, participants):

self.group = group

self.participants = participants

# 根據 Ironmen 類別建立一個物件 modern_web

modern_web = Ironmen("Modern Web", 54)

print(modern_web)

使用对象的属性(Attribute)

在对象名称后面使用 . 接属性名称就可以使用。

class Ironmen:

'''這是一個叫做 Ironmen 的類別''' # Doc string

def __init__(self, group, participants):

self.group = group

self.participants = participants

# 根據 Ironmen 類別建立一個物件 modern_web

modern_web = Ironmen("Modern Web", 54)

# 印出 modern_web 的兩個屬性

print(modern_web.group)

print(modern_web.participants)

# 印出 modern_web 的類別 doc string

print(modern_web.__doc__)

在我们建立好属于 Ironmen 类别的 modern_web 物件后,在 jupyter notebook 中我们还可以透过 tab 键来查看这个类别有哪些属性(前后带有两个底线 的是预设属性。)

我们也可以使用内建函数 dir() 来列出物件全部的属性。

class Ironmen:

'''這是一個叫做 Ironmen 的類別''' # Doc string

def __init__(self, group, participants):

self.group = group

self.participants = participants

# 根據 Ironmen 類別建立一個物件 modern_web

modern_web = Ironmen("Modern Web", 54)

# 使用 dir() 函數

dir(modern_web)

定义方法(Method)

除了 __init__ 方法之外利用 def 定义更多属于这个类别的方法。

class Ironmen:

'''這是一個叫做 Ironmen 的類別''' # Doc string

def __init__(self, group, participants):

self.group = group

self.participants = participants

def print_info(self):

print(self.group, "組有", self.participants, "位鐵人參賽!")

# 根據 Ironmen 類別建立一個物件 modern_web

modern_web = Ironmen("Modern Web", 54)

# 根據 Ironmen 類別建立一個物件 dev_ops

dev_ops = Ironmen("DevOps", 8)

# 使用 modern_web 的 print_info() 方法

modern_web.print_info()

# 使用 dev_ops 的 print_info() 方法

dev_ops.print_info()

继承(Inheritance)

新定义的类别可以继承既有定义好的类别,可以沿用既有类别中的属性及方法。

class Ironmen:

'''這是一個叫做 Ironmen 的類別''' # Doc string

def __init__(self, group, participants):

self.group = group

self.participants = participants

def print_info(self):

print(self.group, "組有", self.participants, "位鐵人參賽!")

# Articles 類別繼承 Ironmen 類別

class Articles(Ironmen):

'''

這是一個叫做 Articles 的類別。

Articles 繼承 Ironmen 類別,她新增了一個 print_articles() 方法

'''

def print_articles(self):

print(self.group, "組預計會有", self.participants * 30, "篇文章!")

# 根據 Articles 類別建立一個物件 modern_web

modern_web = Articles("Modern Web", 54)

# 使用 modern_web 的 print_articles() 方法

modern_web.print_articles()

# 檢查 modern_web 是否還擁有 print_info() 方法

modern_web.print_info()

在继承时使用 super()

可以根据原本的属性或方法之上建立新的属性或方法。

class OnlyGroup:

'''這是一個叫做 OnlyGroup 的類別''' # Doc string

def __init__(self, group):

self.group = group

# Ironmen 類別繼承 OnlyGroup 類別

class Ironmen(OnlyGroup):

'''這是一個叫做 Ironmen 的類別''' # Doc string

def __init__(self, group, participants):

super().__init__(group)

self.participants = participants

# 根據 Ironmen 類別建立一個物件 modern_web

modern_web = Ironmen("Modern Web", 54)

# 印出 modern_web 的兩個屬性

print(modern_web.group)

print(modern_web.participants)

在继承时改写方法(Override)

我们在先前继承时成功增加一个方法 print_articles(),现在我们要试着在 Article 类别中改写原本 Ironmen 类别中的 print_info() 方法。

class Ironmen:

'''這是一個叫做 Ironmen 的類別''' # Doc string

def __init__(self, group, participants):

self.group = group

self.participants = participants

def print_info(self):

print(self.group, "組有", self.participants, "位鐵人參賽!")

# Articles 類別繼承 Ironmen 類別

class Articles(Ironmen):

'''

這是一個叫做 Articles 的類別。

Articles 繼承 Ironmen 類別,她新增了一個 print_articles() 方法

'''

def print_articles(self):

print(self.group, "組預計會有", self.participants * 30, "篇文章!")

# 改寫 print_info() 方法

def print_info(self):

print(self.group, "組有", self.participants, "位鐵人參賽!p.s.我被改寫了!")

# 根據 Articles 類別建立一個物件 modern_web

modern_web = Articles("Modern Web", 54)

# 檢查 modern_web 的 print_info() 方法是否被改寫

modern_web.print_info()

小結

第十天我们讨论 Python 的面向对象,我们透过简单的范例来定义类别,在定义类别的时候指定属于该类别的属性与方法,然后建立出属于该类别的物件,除此之外我们还讨论了新增类别,新增方法与改写方法。

本文来自企鹅号 - 灯火学院媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏desperate633

LeetCode 134. Gas Station题目分析

There are N gas stations along a circular route, where the amount of gas at stat...

11540
来自专栏racaljk

人工智能搜索策略(上)

   广度优先搜索: 从初始节点S0开始逐层向下扩展,在第n层节点还没有全部搜索完之前,不进入第n+1层节点的搜索。Open表中的节点总是按进入的先后排序,先进...

49540
来自专栏大数据文摘

你的数据科学python编程能力过关吗?看看这40道题你能得几分

17630
来自专栏阮一峰的网络日志

贝叶斯推断及其互联网应用(三):拼写检查

(这个系列的第一部分介绍了贝叶斯定理,第二部分介绍了如何过滤垃圾邮件,今天是第三部分。) 使用Google的时候,如果你拼错一个单词,它会提醒你正确的拼法。 比...

430120
来自专栏PPV课数据科学社区

【学习】《R实战》读书笔记(第二章)

“读书会是一种在于拓展视野、宏观思维、知识交流、提升生活的活动。PPV课R语言读书会以“学习、分享、进步”为宗旨,通过成员协作完成R语言专业书籍的精读和分享,达...

36890
来自专栏Python小屋

Python使用numpy和pandas模拟转盘抽奖游戏

之前写过一个类似的代码,不过都是用的Python内置对象,详见几行Python代码模拟轮盘抽奖游戏,本文再提供一个使用numpy和pandas实现的代码。 问题...

39080
来自专栏Jerry的SAP技术分享

如何计算并测量ABAP及Java代码的环复杂度Cyclomatic complexity

代码的环复杂度(Cyclomatic complexity,有的地方又翻译成圈复杂度)是一种代码复杂度的衡量标准,在1976年由Thomas J. McCabe...

37890
来自专栏吉浦迅科技

DAY38:阅读存储器修饰符

11830
来自专栏机器学习算法与理论

寻找商品间的联系:频繁项集挖掘与关联分析

我们常常会在管理中遇到这样的问题,超市如何能通过用户购买数据来提高利润。如何将数据转化为利润,用好这些数据。 我们这里提出一种关联分析方法,可以从用户的购买数...

40880
来自专栏人工智能LeadAI

Theano调试技巧

Theano是最老牌的深度学习库之一。它灵活的特点使其非常适合学术研究和快速实验,但是它难以调试的问题也遭到过无数吐槽。其实Theano本身提供了很多辅助调试的...

1.1K90

扫码关注云+社区

领取腾讯云代金券