動态語言的定義
動态程式設計語言 是 進階程式設計語言 的一個類别,在計算機科學領域已被廣泛應用。它是一類 在運作時可以改變其結構的語言 :例如新的函數、對象、甚至代碼可以被引進,已有的函數可以被删除或是其他結構上的變化。動态語言目前非常具有活力。例如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技術之道”,了解相關資訊可以關注“
”。