定義:
動(dòng)態(tài)編程語言是高級(jí)程序設(shè)計(jì)語言的一個(gè)類別,它是一類在運(yùn)行時(shí)可以改變其結(jié)構(gòu)的語言:例如新的函數(shù)蚜退、對(duì)象闰靴、甚至代碼可以被引進(jìn),已有的函數(shù)可以被刪除或是其他結(jié)構(gòu)上的變化钻注。動(dòng)態(tài)語言目前非常具有活力
給對(duì)象添加屬性,給類添加屬性,給類添加方法,刪除屬性.
刪除的方法:
1.del對(duì)象.屬性名
2.delattr(對(duì)象, "屬性名")
動(dòng)態(tài)語言可以在運(yùn)行的過程中,修改代碼.
靜態(tài)語言:編譯時(shí)已經(jīng)確定好代碼蚂且,運(yùn)行過程中不能修改
如果想要限制屬性,可以用__slots__變量,限制類市里能添加的屬性
·__slots__定義的屬性僅對(duì)當(dāng)前類實(shí)例起作用,對(duì)繼承的子類是不起作用的
元類:
動(dòng)態(tài)創(chuàng)建類:
使用type創(chuàng)建帶有屬性和方法的類:
In [46]:defecho_bar(self):#定義了一個(gè)普通的函數(shù)
...:print(self.bar)
...:
In [47]: FooChild = type('FooChild', (Foo,), {'echo_bar': echo_bar})#讓FooChild類中的echo_bar屬性幅恋,指向了上面定義的函數(shù)
In [48]: hasattr(Foo,'echo_bar')#判斷Foo類中杏死,是否有echo_bar這個(gè)屬性
Out[48]:False
In [49]:
In [49]: hasattr(FooChild,'echo_bar')#判斷FooChild類中,是否有echo_bar這個(gè)屬性
Out[49]:True
In [50]: my_foo = FooChild()
In [51]: my_foo.echo_bar()
True
添加靜態(tài)方法
In [36]: @staticmethod
...:deftestStatic():
...:print("static method ....")
...:
In [37]: Foochild = type('Foochild', (Foo,), {"echo_bar":echo_bar,"testStatic":
...: testStatic})
In [38]: fooclid = Foochild()
In [39]: fooclid.testStatic
Out[39]:
In [40]: fooclid.testStatic()
static method ....
In [41]: fooclid.echo_bar()
True
添加類方法
In [42]: @classmethod
...:deftestClass(cls):
...:print(cls.bar)
...:
In [43]:
In [43]: Foochild = type('Foochild', (Foo,), {"echo_bar":echo_bar,"testStatic":
...: testStatic,"testClass":testClass})
In [44]:
In [44]: fooclid = Foochild()
In [45]: fooclid.testClass()
True
元類就是用來創(chuàng)建類的東西,你創(chuàng)建類就是為了創(chuàng)建類的實(shí)例對(duì)象,元類就是類的類
在python中萬物皆對(duì)象,而且他們都是從一個(gè)類創(chuàng)建出來的,就是type
__metaclass__屬性
你首先寫下class Foo(object)捆交,但是類Foo還沒有在內(nèi)存中創(chuàng)建淑翼。Python會(huì)在類的定義中尋找__metaclass__屬性,如果找到了品追,Python就會(huì)用它來創(chuàng)建類Foo玄括,如果沒有找到,就會(huì)用內(nèi)建的type來創(chuàng)建這個(gè)類肉瓦。
classFoo(Bar):
? ? pass