Python動態語言之魅力大揭秘

2022-08-23 10:30:15 字數 3477 閱讀 3168

之前的文章跟大家講解了鴨子型別,其實鴨子型別是程式語言中動態型別語言中的一種設計風格。今天跟大家一起談談動態語言的魅力。

根據維基百科,動態程式語言是這樣子定義的:

動態程式語言是高階程式語言的乙個類別,在電腦科學領域已被廣泛應用。它是一類在執行時可以改變其結構的語言:例如新的函式、物件、甚至**可以被引進,已有的函式可以被刪除或是其他結構上的變化。

動態語言是一門在執行時可以改變其結構的語言,這句話如何理解?

我們先看看示例1。

#示例1

class person(object):

def __init__(self,name=none,age=none):

self.name = name

self.age = age

jack = person("jack",18)

print(jack.age)

在示例1中,我們定義了person類,然後建立了jack物件,列印物件的age屬性,這沒毛病。現實中人除了名字和年齡,還會有其他屬性,例如身高和體重。我們嘗試列印一下身高屬性。

print(jack.height)
毫無疑問,這會報錯,因為person類中沒有定義height屬性。但是如果在程式執行的時候新增height屬性,會發生什麼呢?,請看示例2和示例3。

#示例2

jack.height = 170

print(jack.height)

#輸出結果:170

#示例3

setattr(jack,'height',170)

print(jack.height)

#輸出結果:170

在示例2中,我們給jack新增了height屬性,然後列印,沒有報錯,可以輸出結果。我們列印一下物件的屬性。

print(jack.__dict__)

#輸出結果:

#

你看,本來物件是沒有height屬性,但是可以在程式執行過程中給例項動態繫結屬性,這就是動態語言的魅力,不過還是有一些坑的,我們再看看示例4。

#示例4

mia = person('mia',18)

print(mia.__dict__)

#輸出結果:

#

奇怪!mia物件居然沒有height屬性。為什麼?事實上,在示例2中,我們只是給類示例動態地繫結了乙個屬性,而不是給繫結屬性,所以重新建立的物件是沒有height屬性的。如果想要給類新增,也是可以的,見示例5。

#示例5

person.height = none

mia = person("mia",18)

print(mia.height)

#輸出結果:none

搞定了屬性的動態繫結,其實動態刪除也是同乙個道理,請看示例5。

#示例5

mia = person("mia",18)

delattr(mia,'height')

print(mia.__dict__)

#輸出結果:

搞定了屬性的動態繫結和刪除,接下來看看方法的繫結和刪除,請看示例6。

#示例6

class person(object):

def __init__(self,name=none,age=none):

self.name = name

self.age = age

def speak_name(self):

print(self.name)

jack = person("jack",18)

jack.speak_name = speak_name

jack.speak_name(jack)

print(jack.__dict__)

mia = person("mia",18)

print(mia.__dict__)

輸出結果:

jack

在示例6中,物件jack的屬性中已經成功新增了speak函式。但是!有沒有感覺示例6中,這個語句

jack.speak_name(jack)
很彆扭。按常理來說,應該

jack.speak_name()
就行了。如果想要達到這種效果,應該要像下面這樣子做。

import types

jack.speak_name = types.methodtype(speak_name,jack)

jack.speak_name()

#輸出結果:jack

其中methodtype用於繫結方法物件。

當然示例6都是給類示例繫結了方法,但是如果要給類繫結方法的話,又應該怎麼做?請看示例7。

#示例7

import types

class person(object):

def __init__(self,name=none,age=none):

self.name = name

self.age = age

def speak_ok(cls):

print(ok)

person.speak_name = types.methodtype(speak_ok,person)

person.speak_ok()

# 輸出結果:ok

示例1-7給大家解析了維基百科對動態語言的定義,希望可以幫助你對python的理解。

下面說一下比較容易混淆的概念。

動態型別語言與動態語言

其實動態型別語言跟動態語言是不一樣的概念。

動態型別語言指的是在執行期間才去判斷資料型別的語言,強調的是資料型別。

動態語言指的是它是在執行時可以改變其結構的語言,強調的是**結構。

靜態型別語言與靜態語言

靜態型別語言指的是執行之前(編譯期間)會去判斷資料型別的語言,強調的也是資料型別。

靜態語言指的是在執行期間不能改變其結構的語言,強調的是**結構。

專注於分享python和計算機視覺。我們堅持原創,不定期更新,希望我們的文章可以啟發你,一起進步。

Python語言之函式

函式 函式構造 def 函式名 形參名1 形參名2 return 待返回引數 函式呼叫 函式名 實參1 實參2 注意 利用函式程式設計的方法 函式套用 結構化程式設計 問題求解 自上而下分解問題,再自下而上設計函式利用函式巢狀求解問題 至下而上的設計程式結構 全域性變數 寫在主程式的形參 區域性變數...

Python語言之字典

字典 一系列的 鍵 值 對 格式 訪問字典 字典名 鍵名 新增乙個鍵值對 字典名 鍵名 鍵值 舉例 my dict john 2016 bob 2018 my dict john my dict martin 2019 字典運算子與方法 返回字典鍵值對的數目 len 字典名 快速判斷key是否為字典...

Python 語言之 元組

python 的元組是乙個不可修改的元素的集合,元素間用逗號隔開。元組和列表類似,但是不同點是元組的值一旦設定不能修改,列表的元素設定後仍然可以修改。因為元組不可修改,所以元組的操作要快於列表。因為元組不能修改,所以可以用作字典的鍵值。元組也可以用來實現函式同時返回多個值。使用小括號定義元組,空的小...