天天看點

Python是一門動态語言

動态語言的定義

動态程式設計語言 是 進階程式設計語言 的一個類别,在計算機科學領域已被廣泛應用。它是一類 在運作時可以改變其結構的語言 :例如新的函數、對象、甚至代碼可以被引進,已有的函數可以被删除或是其他結構上的變化。動态語言目前非常具有活力。例如JavaScript便是一個動态語言,除此之外如 PHP 、 Ruby 、 Python 等也都屬于動态語言,而 C 、 C++ 等語言則不屬于動态語言。

給對象綁定(添加)屬性

class Car(object):

def __init__(self, Carname = None, CarMoney = None):

self.Carname= Carname self.CarMoney= CarMoney

C = Car("法拉利", "3000000")           

在這裡,我們定義了1個類Car,在這個類裡,定義了兩個初始屬性Carname和CarMoney,但是人還有性别啊!如果這個類不是你寫的是不是你會嘗試通路性别這個屬性呢?

>>> C.user = "技術大爆炸">>> P.user'技術大爆炸'>>>

這時候就發現問題了,我們定義的類裡面沒有sex這個屬性啊!怎麼回事呢? 這就是動态語言的魅力和坑! 這裡 實際上就是 動态給執行個體綁定屬性!

給類綁定(添加)屬性

C1 = Car("悍馬", "2000000")

C1.user

Traceback (most recent call last): File "<pyshell#21>", line 1, in <module>

C1.user AttributeError: Car instance has no attribute 'user'>>>           

我們嘗試列印C1.user,發現報錯,C1沒有user這個屬性!---- 給C這個執行個體綁定屬性對C1這個執行個體不起作用! 那我們要給所有的Car的執行個體加上user屬性怎麼辦呢? 答案就是直接給Car綁定屬性!

Car.user = None #給類Car添加一個屬性>>>

C1 = Car("悍馬", "2000000")

print(C1.user)           

#如果C1這個執行個體對象中沒有user屬性的話,那麼就會通路它的類屬性None

#可以看到沒有出現異常>>>

我們直接給Car綁定user這個屬性,重新執行個體化C1後,C1就有user這個屬性了! 那麼function呢?怎麼綁定?

class Car(object):

def __init__(self, Carname = None,money = None):

self.Carname = Carname self.money = money

def drive(self):

print("drive")

def run(self, speed):

print("%s在移動, 速度是 %d km/h"%(self.Carname, speed))

C = Car("法拉利", 2400000)

C.drive() driving >>>

C.run()

Traceback (most recent call last): File "<pyshell#5>", line 1, in <module>

C.run() AttributeError: Person instance has no attribute 'run'>>>

import types

C.run = types.MethodType(run, P)

C.run(180) 法拉利在移動,速度是 180 km/h           

既然給類添加方法,是使用類名.方法名 = xxxx,那麼給對象添加一個方法也是類似的對象.方法名 = xxxx

完整的代碼如下:

import types#定義了一個類

class Car(object): num = 0

def __init__(self, Carname = None, money = None):

self.Carname = Carname self.age = age

def drive(self):

print("drive")

#定義一個執行個體方法def run(self, speed):

print("%s在移動, 速度是 %d km/h"%(self.name, speed))

#定義一個類方法@classmethoddef

testClass(cls):

cls.num = 100

#定義一個靜态方法@staticmethoddef testStatic():

print("---static method----")

#建立一個執行個體對象

C= Car("法拉利", 2400000)

#調用在class中的方法

C.drive()

#給這個對象添加執行個體方法

C.run = types.MethodType(run, P)

#調用執行個體方法

C.run(180)

#給Person類綁定類方法

Car.testClass = testClass

#調用類方法

print(Car.num)

Car.testClass() print(Car.num)

#給Person類綁定靜态方法

Car.testStatic = testStatic

#調用靜态方法

Car.testStatic()           

删除屬性、方法

删除的方法:

del 對象.屬性名

delattr(對象, "屬性名")           

通過以上例子可以得出一個結論:相對于動态語言,靜态語言具有嚴謹性!是以,玩動态語言的時候,小心動态的坑!

那麼怎麼避免這種情況呢? 請使用__slots__,

原文釋出時間為:2018-08-19

本文作者:高小傑

本文來自雲栖社群合作夥伴“

IT技術之道

”,了解相關資訊可以關注“

”。