'python小課堂19 - 面向對象篇(二)'

Python Java 設計 咪哥雜談 2019-09-07
"

前言

哈嘍呀Everybody,又到了更新干貨的時間了,繼續python小課堂的迴歸之路,面向對象篇的第二章,面向對象的涉及的東西實在是太多了,所以打算拆開三次寫吧,後面還有一次面向對象篇,但是打算寫完這篇之後用面向對象的設計思想來一波實戰篇教學,依然是和安全相關的,敬請期待.....

實例對象中的self

回顧下上一章中,學習了定義一個對象(類)的方法,並且這個類中有自己的類變量以及實力變量,還有自己對應的方法以及構造方法。在實例方法中有個特殊的關鍵詞需要默認傳入 -- self 。來看下引用上節的例子。


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self,name,age):
self.name = name
self.age = age
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩',18) # 實例化
girlFriend.say_feature()

實際上,self這個關鍵字並不一定非得叫self,如果學過java的同學一定知道this這個關鍵詞,特指在一個類中實例對象生成後的本身,而python中的self與其一致,我們可以將self修改成this來看下程序會不會正常運行。

"

前言

哈嘍呀Everybody,又到了更新干貨的時間了,繼續python小課堂的迴歸之路,面向對象篇的第二章,面向對象的涉及的東西實在是太多了,所以打算拆開三次寫吧,後面還有一次面向對象篇,但是打算寫完這篇之後用面向對象的設計思想來一波實戰篇教學,依然是和安全相關的,敬請期待.....

實例對象中的self

回顧下上一章中,學習了定義一個對象(類)的方法,並且這個類中有自己的類變量以及實力變量,還有自己對應的方法以及構造方法。在實例方法中有個特殊的關鍵詞需要默認傳入 -- self 。來看下引用上節的例子。


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self,name,age):
self.name = name
self.age = age
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩',18) # 實例化
girlFriend.say_feature()

實際上,self這個關鍵字並不一定非得叫self,如果學過java的同學一定知道this這個關鍵詞,特指在一個類中實例對象生成後的本身,而python中的self與其一致,我們可以將self修改成this來看下程序會不會正常運行。

python小課堂19 - 面向對象篇(二)

可以看到上圖,改成this後依然成功運行,所以self只是python中的一個官方寫法,具體你要定義成什麼樣子的默認第一個參數,隨你喜好,但是推薦默認self就好啦。

實例對象中的變量機制(dict)

通過 dict可以查看實例對象的屬性。什麼意思呢?來看下:


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self, name, age):
self.name = name
self.age = age
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩', 18) # 實例化
print(girlFriend.__dict__)

"

前言

哈嘍呀Everybody,又到了更新干貨的時間了,繼續python小課堂的迴歸之路,面向對象篇的第二章,面向對象的涉及的東西實在是太多了,所以打算拆開三次寫吧,後面還有一次面向對象篇,但是打算寫完這篇之後用面向對象的設計思想來一波實戰篇教學,依然是和安全相關的,敬請期待.....

實例對象中的self

回顧下上一章中,學習了定義一個對象(類)的方法,並且這個類中有自己的類變量以及實力變量,還有自己對應的方法以及構造方法。在實例方法中有個特殊的關鍵詞需要默認傳入 -- self 。來看下引用上節的例子。


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self,name,age):
self.name = name
self.age = age
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩',18) # 實例化
girlFriend.say_feature()

實際上,self這個關鍵字並不一定非得叫self,如果學過java的同學一定知道this這個關鍵詞,特指在一個類中實例對象生成後的本身,而python中的self與其一致,我們可以將self修改成this來看下程序會不會正常運行。

python小課堂19 - 面向對象篇(二)

可以看到上圖,改成this後依然成功運行,所以self只是python中的一個官方寫法,具體你要定義成什麼樣子的默認第一個參數,隨你喜好,但是推薦默認self就好啦。

實例對象中的變量機制(dict)

通過 dict可以查看實例對象的屬性。什麼意思呢?來看下:


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self, name, age):
self.name = name
self.age = age
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩', 18) # 實例化
print(girlFriend.__dict__)

python小課堂19 - 面向對象篇(二)

可以看到結果,將實例化後的對象中的變量成員以字典的形式打印出來,name和age是實例變量,而人類女孩和18便是我通過創建對象時傳入的參數。

實例方法訪問變量

實例方法:見名知意,即類中定義的方法,需要實例化對象後才能調用的方法稱之為實例方法。比如在上面的GirlFriend類中的say_feature(),就叫實例方法。那麼問題來了,實例方法可以直接訪問實例變量,這是大家都可以想到的,比如在say_feature()中通過self.name調用了實例變量name。那實例方法中如何訪問類的變量呢?在上面的代碼中,類變量就是total_nums,也就是你迄今為止交過女朋友的總數量。 先來個 錯誤的例子:


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self, name, age):
self.name = name
self.age = age
print(f'訪問類變量total_nums:{total_nums}')
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩', 18) # 實例化
print(girlFriend.__dict__)

"

前言

哈嘍呀Everybody,又到了更新干貨的時間了,繼續python小課堂的迴歸之路,面向對象篇的第二章,面向對象的涉及的東西實在是太多了,所以打算拆開三次寫吧,後面還有一次面向對象篇,但是打算寫完這篇之後用面向對象的設計思想來一波實戰篇教學,依然是和安全相關的,敬請期待.....

實例對象中的self

回顧下上一章中,學習了定義一個對象(類)的方法,並且這個類中有自己的類變量以及實力變量,還有自己對應的方法以及構造方法。在實例方法中有個特殊的關鍵詞需要默認傳入 -- self 。來看下引用上節的例子。


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self,name,age):
self.name = name
self.age = age
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩',18) # 實例化
girlFriend.say_feature()

實際上,self這個關鍵字並不一定非得叫self,如果學過java的同學一定知道this這個關鍵詞,特指在一個類中實例對象生成後的本身,而python中的self與其一致,我們可以將self修改成this來看下程序會不會正常運行。

python小課堂19 - 面向對象篇(二)

可以看到上圖,改成this後依然成功運行,所以self只是python中的一個官方寫法,具體你要定義成什麼樣子的默認第一個參數,隨你喜好,但是推薦默認self就好啦。

實例對象中的變量機制(dict)

通過 dict可以查看實例對象的屬性。什麼意思呢?來看下:


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self, name, age):
self.name = name
self.age = age
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩', 18) # 實例化
print(girlFriend.__dict__)

python小課堂19 - 面向對象篇(二)

可以看到結果,將實例化後的對象中的變量成員以字典的形式打印出來,name和age是實例變量,而人類女孩和18便是我通過創建對象時傳入的參數。

實例方法訪問變量

實例方法:見名知意,即類中定義的方法,需要實例化對象後才能調用的方法稱之為實例方法。比如在上面的GirlFriend類中的say_feature(),就叫實例方法。那麼問題來了,實例方法可以直接訪問實例變量,這是大家都可以想到的,比如在say_feature()中通過self.name調用了實例變量name。那實例方法中如何訪問類的變量呢?在上面的代碼中,類變量就是total_nums,也就是你迄今為止交過女朋友的總數量。 先來個 錯誤的例子:


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self, name, age):
self.name = name
self.age = age
print(f'訪問類變量total_nums:{total_nums}')
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩', 18) # 實例化
print(girlFriend.__dict__)

python小課堂19 - 面向對象篇(二)

看到控制檯報錯,輸出沒有定義total_nums,說明這種方式在實例方法中直接訪問類變量是錯誤的。

正確的例子1:

"

前言

哈嘍呀Everybody,又到了更新干貨的時間了,繼續python小課堂的迴歸之路,面向對象篇的第二章,面向對象的涉及的東西實在是太多了,所以打算拆開三次寫吧,後面還有一次面向對象篇,但是打算寫完這篇之後用面向對象的設計思想來一波實戰篇教學,依然是和安全相關的,敬請期待.....

實例對象中的self

回顧下上一章中,學習了定義一個對象(類)的方法,並且這個類中有自己的類變量以及實力變量,還有自己對應的方法以及構造方法。在實例方法中有個特殊的關鍵詞需要默認傳入 -- self 。來看下引用上節的例子。


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self,name,age):
self.name = name
self.age = age
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩',18) # 實例化
girlFriend.say_feature()

實際上,self這個關鍵字並不一定非得叫self,如果學過java的同學一定知道this這個關鍵詞,特指在一個類中實例對象生成後的本身,而python中的self與其一致,我們可以將self修改成this來看下程序會不會正常運行。

python小課堂19 - 面向對象篇(二)

可以看到上圖,改成this後依然成功運行,所以self只是python中的一個官方寫法,具體你要定義成什麼樣子的默認第一個參數,隨你喜好,但是推薦默認self就好啦。

實例對象中的變量機制(dict)

通過 dict可以查看實例對象的屬性。什麼意思呢?來看下:


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self, name, age):
self.name = name
self.age = age
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩', 18) # 實例化
print(girlFriend.__dict__)

python小課堂19 - 面向對象篇(二)

可以看到結果,將實例化後的對象中的變量成員以字典的形式打印出來,name和age是實例變量,而人類女孩和18便是我通過創建對象時傳入的參數。

實例方法訪問變量

實例方法:見名知意,即類中定義的方法,需要實例化對象後才能調用的方法稱之為實例方法。比如在上面的GirlFriend類中的say_feature(),就叫實例方法。那麼問題來了,實例方法可以直接訪問實例變量,這是大家都可以想到的,比如在say_feature()中通過self.name調用了實例變量name。那實例方法中如何訪問類的變量呢?在上面的代碼中,類變量就是total_nums,也就是你迄今為止交過女朋友的總數量。 先來個 錯誤的例子:


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self, name, age):
self.name = name
self.age = age
print(f'訪問類變量total_nums:{total_nums}')
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩', 18) # 實例化
print(girlFriend.__dict__)

python小課堂19 - 面向對象篇(二)

看到控制檯報錯,輸出沒有定義total_nums,說明這種方式在實例方法中直接訪問類變量是錯誤的。

正確的例子1:

python小課堂19 - 面向對象篇(二)

實際上在上一節的python小課堂的末尾處,提到過如何在類外訪問類變量,直接通過類.變量即可訪問,在實例對象內部也可以通過這種方式進行訪問。

正確的例子2:

"

前言

哈嘍呀Everybody,又到了更新干貨的時間了,繼續python小課堂的迴歸之路,面向對象篇的第二章,面向對象的涉及的東西實在是太多了,所以打算拆開三次寫吧,後面還有一次面向對象篇,但是打算寫完這篇之後用面向對象的設計思想來一波實戰篇教學,依然是和安全相關的,敬請期待.....

實例對象中的self

回顧下上一章中,學習了定義一個對象(類)的方法,並且這個類中有自己的類變量以及實力變量,還有自己對應的方法以及構造方法。在實例方法中有個特殊的關鍵詞需要默認傳入 -- self 。來看下引用上節的例子。


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self,name,age):
self.name = name
self.age = age
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩',18) # 實例化
girlFriend.say_feature()

實際上,self這個關鍵字並不一定非得叫self,如果學過java的同學一定知道this這個關鍵詞,特指在一個類中實例對象生成後的本身,而python中的self與其一致,我們可以將self修改成this來看下程序會不會正常運行。

python小課堂19 - 面向對象篇(二)

可以看到上圖,改成this後依然成功運行,所以self只是python中的一個官方寫法,具體你要定義成什麼樣子的默認第一個參數,隨你喜好,但是推薦默認self就好啦。

實例對象中的變量機制(dict)

通過 dict可以查看實例對象的屬性。什麼意思呢?來看下:


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self, name, age):
self.name = name
self.age = age
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩', 18) # 實例化
print(girlFriend.__dict__)

python小課堂19 - 面向對象篇(二)

可以看到結果,將實例化後的對象中的變量成員以字典的形式打印出來,name和age是實例變量,而人類女孩和18便是我通過創建對象時傳入的參數。

實例方法訪問變量

實例方法:見名知意,即類中定義的方法,需要實例化對象後才能調用的方法稱之為實例方法。比如在上面的GirlFriend類中的say_feature(),就叫實例方法。那麼問題來了,實例方法可以直接訪問實例變量,這是大家都可以想到的,比如在say_feature()中通過self.name調用了實例變量name。那實例方法中如何訪問類的變量呢?在上面的代碼中,類變量就是total_nums,也就是你迄今為止交過女朋友的總數量。 先來個 錯誤的例子:


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self, name, age):
self.name = name
self.age = age
print(f'訪問類變量total_nums:{total_nums}')
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩', 18) # 實例化
print(girlFriend.__dict__)

python小課堂19 - 面向對象篇(二)

看到控制檯報錯,輸出沒有定義total_nums,說明這種方式在實例方法中直接訪問類變量是錯誤的。

正確的例子1:

python小課堂19 - 面向對象篇(二)

實際上在上一節的python小課堂的末尾處,提到過如何在類外訪問類變量,直接通過類.變量即可訪問,在實例對象內部也可以通過這種方式進行訪問。

正確的例子2:

python小課堂19 - 面向對象篇(二)


# 通過 self.__class__ 調用類變量也可以進行調用
self.__class__.total_nums

類變量還有個特性,就是實例化對象將其共有,這種場景也許在以後的編程中會遇到,我這裡依然以女朋友舉例,每個實例變量是你每個不同女票的名字和年齡,而假設你每次交一個女票,這個交女朋友的總數total_nums就會增加1。

來看下代碼示例:


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self, name, age):
self.name = name
self.age = age
self.__class__.total_nums += 1
print(f'迄今為止交到的女朋友個數total_nums:{self.__class__.total_nums}')
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩1', 18) # 實例化
girlFriend2 = GirlFriend('人類女孩2', 23) # 實例化
girlFriend3 = GirlFriend('人類女孩3', 20) # 實例化

"

前言

哈嘍呀Everybody,又到了更新干貨的時間了,繼續python小課堂的迴歸之路,面向對象篇的第二章,面向對象的涉及的東西實在是太多了,所以打算拆開三次寫吧,後面還有一次面向對象篇,但是打算寫完這篇之後用面向對象的設計思想來一波實戰篇教學,依然是和安全相關的,敬請期待.....

實例對象中的self

回顧下上一章中,學習了定義一個對象(類)的方法,並且這個類中有自己的類變量以及實力變量,還有自己對應的方法以及構造方法。在實例方法中有個特殊的關鍵詞需要默認傳入 -- self 。來看下引用上節的例子。


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self,name,age):
self.name = name
self.age = age
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩',18) # 實例化
girlFriend.say_feature()

實際上,self這個關鍵字並不一定非得叫self,如果學過java的同學一定知道this這個關鍵詞,特指在一個類中實例對象生成後的本身,而python中的self與其一致,我們可以將self修改成this來看下程序會不會正常運行。

python小課堂19 - 面向對象篇(二)

可以看到上圖,改成this後依然成功運行,所以self只是python中的一個官方寫法,具體你要定義成什麼樣子的默認第一個參數,隨你喜好,但是推薦默認self就好啦。

實例對象中的變量機制(dict)

通過 dict可以查看實例對象的屬性。什麼意思呢?來看下:


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self, name, age):
self.name = name
self.age = age
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩', 18) # 實例化
print(girlFriend.__dict__)

python小課堂19 - 面向對象篇(二)

可以看到結果,將實例化後的對象中的變量成員以字典的形式打印出來,name和age是實例變量,而人類女孩和18便是我通過創建對象時傳入的參數。

實例方法訪問變量

實例方法:見名知意,即類中定義的方法,需要實例化對象後才能調用的方法稱之為實例方法。比如在上面的GirlFriend類中的say_feature(),就叫實例方法。那麼問題來了,實例方法可以直接訪問實例變量,這是大家都可以想到的,比如在say_feature()中通過self.name調用了實例變量name。那實例方法中如何訪問類的變量呢?在上面的代碼中,類變量就是total_nums,也就是你迄今為止交過女朋友的總數量。 先來個 錯誤的例子:


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self, name, age):
self.name = name
self.age = age
print(f'訪問類變量total_nums:{total_nums}')
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩', 18) # 實例化
print(girlFriend.__dict__)

python小課堂19 - 面向對象篇(二)

看到控制檯報錯,輸出沒有定義total_nums,說明這種方式在實例方法中直接訪問類變量是錯誤的。

正確的例子1:

python小課堂19 - 面向對象篇(二)

實際上在上一節的python小課堂的末尾處,提到過如何在類外訪問類變量,直接通過類.變量即可訪問,在實例對象內部也可以通過這種方式進行訪問。

正確的例子2:

python小課堂19 - 面向對象篇(二)


# 通過 self.__class__ 調用類變量也可以進行調用
self.__class__.total_nums

類變量還有個特性,就是實例化對象將其共有,這種場景也許在以後的編程中會遇到,我這裡依然以女朋友舉例,每個實例變量是你每個不同女票的名字和年齡,而假設你每次交一個女票,這個交女朋友的總數total_nums就會增加1。

來看下代碼示例:


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self, name, age):
self.name = name
self.age = age
self.__class__.total_nums += 1
print(f'迄今為止交到的女朋友個數total_nums:{self.__class__.total_nums}')
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩1', 18) # 實例化
girlFriend2 = GirlFriend('人類女孩2', 23) # 實例化
girlFriend3 = GirlFriend('人類女孩3', 20) # 實例化

python小課堂19 - 面向對象篇(二)

看到結果,每次實例化一個女盆友,總數都會增加一次使用場景自行細細品味一番吧......

再多說一句,方法和變量之間的關係:變量其實就是我們日常所說的數據,而方法就是如何去處理數據,也就是將變量讀取後進行相關處理。這層處理關係就是方法和變量的關係!

類方法

在本章開篇處介紹了實例方法,那麼類方法則是不需要進行實例化對象,可以直接通過類.方法進行調用。來看下面的例子:


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self, name, age):
self.name = name
self.age = age
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
# 類方法
@classmethod
def make_girlfriend_count(cls):
cls.total_nums += 1
print(f'迄今為止交到的女朋友個數total_nums:{cls.total_nums}')
GirlFriend.make_girlfriend_count()
GirlFriend.make_girlfriend_count()
girlFriend = GirlFriend('人類女孩1', 18) # 實例化
girlFriend.make_girlfriend_count()

通過在方法上面加上 @classmethod,這樣來定義類方法,這個寫法可以先了解下,後序會講到python的裝飾器,就知道這種寫法的意義了。classmethod,中文翻譯就是類方法的意思,在方法的默認參數中,需要默認給出一個 cls作為參數,這裡類似實例方法中的self字段,他們都是形式上的默認參數,名字可以改變,不一定必須叫cls,python默認會給出cls,而cls是class的簡寫, 也指代的是自己本身。

將交到女朋友的個數作為類方法來演示下最終的運行結果:

"

前言

哈嘍呀Everybody,又到了更新干貨的時間了,繼續python小課堂的迴歸之路,面向對象篇的第二章,面向對象的涉及的東西實在是太多了,所以打算拆開三次寫吧,後面還有一次面向對象篇,但是打算寫完這篇之後用面向對象的設計思想來一波實戰篇教學,依然是和安全相關的,敬請期待.....

實例對象中的self

回顧下上一章中,學習了定義一個對象(類)的方法,並且這個類中有自己的類變量以及實力變量,還有自己對應的方法以及構造方法。在實例方法中有個特殊的關鍵詞需要默認傳入 -- self 。來看下引用上節的例子。


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self,name,age):
self.name = name
self.age = age
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩',18) # 實例化
girlFriend.say_feature()

實際上,self這個關鍵字並不一定非得叫self,如果學過java的同學一定知道this這個關鍵詞,特指在一個類中實例對象生成後的本身,而python中的self與其一致,我們可以將self修改成this來看下程序會不會正常運行。

python小課堂19 - 面向對象篇(二)

可以看到上圖,改成this後依然成功運行,所以self只是python中的一個官方寫法,具體你要定義成什麼樣子的默認第一個參數,隨你喜好,但是推薦默認self就好啦。

實例對象中的變量機制(dict)

通過 dict可以查看實例對象的屬性。什麼意思呢?來看下:


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self, name, age):
self.name = name
self.age = age
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩', 18) # 實例化
print(girlFriend.__dict__)

python小課堂19 - 面向對象篇(二)

可以看到結果,將實例化後的對象中的變量成員以字典的形式打印出來,name和age是實例變量,而人類女孩和18便是我通過創建對象時傳入的參數。

實例方法訪問變量

實例方法:見名知意,即類中定義的方法,需要實例化對象後才能調用的方法稱之為實例方法。比如在上面的GirlFriend類中的say_feature(),就叫實例方法。那麼問題來了,實例方法可以直接訪問實例變量,這是大家都可以想到的,比如在say_feature()中通過self.name調用了實例變量name。那實例方法中如何訪問類的變量呢?在上面的代碼中,類變量就是total_nums,也就是你迄今為止交過女朋友的總數量。 先來個 錯誤的例子:


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self, name, age):
self.name = name
self.age = age
print(f'訪問類變量total_nums:{total_nums}')
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩', 18) # 實例化
print(girlFriend.__dict__)

python小課堂19 - 面向對象篇(二)

看到控制檯報錯,輸出沒有定義total_nums,說明這種方式在實例方法中直接訪問類變量是錯誤的。

正確的例子1:

python小課堂19 - 面向對象篇(二)

實際上在上一節的python小課堂的末尾處,提到過如何在類外訪問類變量,直接通過類.變量即可訪問,在實例對象內部也可以通過這種方式進行訪問。

正確的例子2:

python小課堂19 - 面向對象篇(二)


# 通過 self.__class__ 調用類變量也可以進行調用
self.__class__.total_nums

類變量還有個特性,就是實例化對象將其共有,這種場景也許在以後的編程中會遇到,我這裡依然以女朋友舉例,每個實例變量是你每個不同女票的名字和年齡,而假設你每次交一個女票,這個交女朋友的總數total_nums就會增加1。

來看下代碼示例:


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self, name, age):
self.name = name
self.age = age
self.__class__.total_nums += 1
print(f'迄今為止交到的女朋友個數total_nums:{self.__class__.total_nums}')
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩1', 18) # 實例化
girlFriend2 = GirlFriend('人類女孩2', 23) # 實例化
girlFriend3 = GirlFriend('人類女孩3', 20) # 實例化

python小課堂19 - 面向對象篇(二)

看到結果,每次實例化一個女盆友,總數都會增加一次使用場景自行細細品味一番吧......

再多說一句,方法和變量之間的關係:變量其實就是我們日常所說的數據,而方法就是如何去處理數據,也就是將變量讀取後進行相關處理。這層處理關係就是方法和變量的關係!

類方法

在本章開篇處介紹了實例方法,那麼類方法則是不需要進行實例化對象,可以直接通過類.方法進行調用。來看下面的例子:


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self, name, age):
self.name = name
self.age = age
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
# 類方法
@classmethod
def make_girlfriend_count(cls):
cls.total_nums += 1
print(f'迄今為止交到的女朋友個數total_nums:{cls.total_nums}')
GirlFriend.make_girlfriend_count()
GirlFriend.make_girlfriend_count()
girlFriend = GirlFriend('人類女孩1', 18) # 實例化
girlFriend.make_girlfriend_count()

通過在方法上面加上 @classmethod,這樣來定義類方法,這個寫法可以先了解下,後序會講到python的裝飾器,就知道這種寫法的意義了。classmethod,中文翻譯就是類方法的意思,在方法的默認參數中,需要默認給出一個 cls作為參數,這裡類似實例方法中的self字段,他們都是形式上的默認參數,名字可以改變,不一定必須叫cls,python默認會給出cls,而cls是class的簡寫, 也指代的是自己本身。

將交到女朋友的個數作為類方法來演示下最終的運行結果:

python小課堂19 - 面向對象篇(二)

調用類方法時,只需要通過類名稱直接調用即可。當然python也支持先實例化在調用類方法,也不會報錯,可以看到上圖中最後一次 調用,但是絕不推薦這樣用,因為沒有意義!

靜態方法

靜態方法:定義時,不需要像類方法和實例方法默認傳入參數,在方法上面聲明一個叫@staticmethod的裝飾器,staticmethod,中文翻譯靜態方法。來看下寫法:


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self, name, age):
self.name = name
self.age = age
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
# 類方法
@classmethod
def make_girlfriend_count(cls):
cls.total_nums += 1
print(f'迄今為止交到的女朋友個數total_nums:{cls.total_nums}')
@staticmethod
def study_language(language,score):
print(f'我在學習{language},熟練分數:{score}')
GirlFriend.study_language('中文',90)

"

前言

哈嘍呀Everybody,又到了更新干貨的時間了,繼續python小課堂的迴歸之路,面向對象篇的第二章,面向對象的涉及的東西實在是太多了,所以打算拆開三次寫吧,後面還有一次面向對象篇,但是打算寫完這篇之後用面向對象的設計思想來一波實戰篇教學,依然是和安全相關的,敬請期待.....

實例對象中的self

回顧下上一章中,學習了定義一個對象(類)的方法,並且這個類中有自己的類變量以及實力變量,還有自己對應的方法以及構造方法。在實例方法中有個特殊的關鍵詞需要默認傳入 -- self 。來看下引用上節的例子。


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self,name,age):
self.name = name
self.age = age
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩',18) # 實例化
girlFriend.say_feature()

實際上,self這個關鍵字並不一定非得叫self,如果學過java的同學一定知道this這個關鍵詞,特指在一個類中實例對象生成後的本身,而python中的self與其一致,我們可以將self修改成this來看下程序會不會正常運行。

python小課堂19 - 面向對象篇(二)

可以看到上圖,改成this後依然成功運行,所以self只是python中的一個官方寫法,具體你要定義成什麼樣子的默認第一個參數,隨你喜好,但是推薦默認self就好啦。

實例對象中的變量機制(dict)

通過 dict可以查看實例對象的屬性。什麼意思呢?來看下:


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self, name, age):
self.name = name
self.age = age
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩', 18) # 實例化
print(girlFriend.__dict__)

python小課堂19 - 面向對象篇(二)

可以看到結果,將實例化後的對象中的變量成員以字典的形式打印出來,name和age是實例變量,而人類女孩和18便是我通過創建對象時傳入的參數。

實例方法訪問變量

實例方法:見名知意,即類中定義的方法,需要實例化對象後才能調用的方法稱之為實例方法。比如在上面的GirlFriend類中的say_feature(),就叫實例方法。那麼問題來了,實例方法可以直接訪問實例變量,這是大家都可以想到的,比如在say_feature()中通過self.name調用了實例變量name。那實例方法中如何訪問類的變量呢?在上面的代碼中,類變量就是total_nums,也就是你迄今為止交過女朋友的總數量。 先來個 錯誤的例子:


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self, name, age):
self.name = name
self.age = age
print(f'訪問類變量total_nums:{total_nums}')
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩', 18) # 實例化
print(girlFriend.__dict__)

python小課堂19 - 面向對象篇(二)

看到控制檯報錯,輸出沒有定義total_nums,說明這種方式在實例方法中直接訪問類變量是錯誤的。

正確的例子1:

python小課堂19 - 面向對象篇(二)

實際上在上一節的python小課堂的末尾處,提到過如何在類外訪問類變量,直接通過類.變量即可訪問,在實例對象內部也可以通過這種方式進行訪問。

正確的例子2:

python小課堂19 - 面向對象篇(二)


# 通過 self.__class__ 調用類變量也可以進行調用
self.__class__.total_nums

類變量還有個特性,就是實例化對象將其共有,這種場景也許在以後的編程中會遇到,我這裡依然以女朋友舉例,每個實例變量是你每個不同女票的名字和年齡,而假設你每次交一個女票,這個交女朋友的總數total_nums就會增加1。

來看下代碼示例:


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self, name, age):
self.name = name
self.age = age
self.__class__.total_nums += 1
print(f'迄今為止交到的女朋友個數total_nums:{self.__class__.total_nums}')
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
girlFriend = GirlFriend('人類女孩1', 18) # 實例化
girlFriend2 = GirlFriend('人類女孩2', 23) # 實例化
girlFriend3 = GirlFriend('人類女孩3', 20) # 實例化

python小課堂19 - 面向對象篇(二)

看到結果,每次實例化一個女盆友,總數都會增加一次使用場景自行細細品味一番吧......

再多說一句,方法和變量之間的關係:變量其實就是我們日常所說的數據,而方法就是如何去處理數據,也就是將變量讀取後進行相關處理。這層處理關係就是方法和變量的關係!

類方法

在本章開篇處介紹了實例方法,那麼類方法則是不需要進行實例化對象,可以直接通過類.方法進行調用。來看下面的例子:


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self, name, age):
self.name = name
self.age = age
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
# 類方法
@classmethod
def make_girlfriend_count(cls):
cls.total_nums += 1
print(f'迄今為止交到的女朋友個數total_nums:{cls.total_nums}')
GirlFriend.make_girlfriend_count()
GirlFriend.make_girlfriend_count()
girlFriend = GirlFriend('人類女孩1', 18) # 實例化
girlFriend.make_girlfriend_count()

通過在方法上面加上 @classmethod,這樣來定義類方法,這個寫法可以先了解下,後序會講到python的裝飾器,就知道這種寫法的意義了。classmethod,中文翻譯就是類方法的意思,在方法的默認參數中,需要默認給出一個 cls作為參數,這裡類似實例方法中的self字段,他們都是形式上的默認參數,名字可以改變,不一定必須叫cls,python默認會給出cls,而cls是class的簡寫, 也指代的是自己本身。

將交到女朋友的個數作為類方法來演示下最終的運行結果:

python小課堂19 - 面向對象篇(二)

調用類方法時,只需要通過類名稱直接調用即可。當然python也支持先實例化在調用類方法,也不會報錯,可以看到上圖中最後一次 調用,但是絕不推薦這樣用,因為沒有意義!

靜態方法

靜態方法:定義時,不需要像類方法和實例方法默認傳入參數,在方法上面聲明一個叫@staticmethod的裝飾器,staticmethod,中文翻譯靜態方法。來看下寫法:


class GirlFriend():
# 交過的女朋友個數
total_nums = 0
# 初始化構造方法
def __init__(self, name, age):
self.name = name
self.age = age
# 行為,說出自己的特徵
def say_feature(self):
print(f'我的姓名:{self.name}')
print(f'我的年齡:{self.age}')
# 類方法
@classmethod
def make_girlfriend_count(cls):
cls.total_nums += 1
print(f'迄今為止交到的女朋友個數total_nums:{cls.total_nums}')
@staticmethod
def study_language(language,score):
print(f'我在學習{language},熟練分數:{score}')
GirlFriend.study_language('中文',90)

python小課堂19 - 面向對象篇(二)

注:在靜態方法和類方法中,是無法直接用self.xxx引用實例變量的。可自行嘗試!

類方法和靜態方法的區別:在調用時,都可以通過類名直接進行調用。但是一般不推薦使用靜態方法,因為類方法同樣可以實現,並且可以通過默認參數cls直接引用類中的類變量使用。

總結

以上就是python面向對象的第二部分,後面我會畫一個思維導圖來整理下學到的相關知識,其實圖一畫出來,邏輯就非常清晰了。回顧下本章內容,介紹了self的應用,類方法的應用,實例方法的應用以及相互之間訪問的關係。文章略長,還望耐心觀看....切忌浮躁(也是說給自己的!)

至此完!

有想學python的同學,歡迎關注公號:migezatan.(咪哥雜談)

"

相關推薦

推薦中...