給 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 的面向对象,我们透过简单的范例来定义类别,在定义类别的时候指定属于该类别的属性与方法,然后建立出属于该类别的物件,除此之外我们还讨论了新增类别,新增方法与改写方法。

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20171216G0FXJD00?refer=cp_1026

扫码关注云+社区