定義:
動態(tài)編程語言是高級程序設計語言的一個類別,它是一類在運行時可以改變其結構的語言:例如新的函數(shù)、對象、甚至代碼可以被引進,已有的函數(shù)可以被刪除或是其他結構上的變化。動態(tài)語言目前非常具有活力
給對象添加屬性,給類添加屬性,給類添加方法,刪除屬性.
刪除的方法:
1.del對象.屬性名
2.delattr(對象, "屬性名")
動態(tài)語言可以在運行的過程中,修改代碼.
靜態(tài)語言:編譯時已經確定好代碼,運行過程中不能修改
如果想要限制屬性,可以用__slots__變量,限制類市里能添加的屬性
·__slots__定義的屬性僅對當前類實例起作用,對繼承的子類是不起作用的
元類:
動態(tài)創(chuàng)建類:
使用type創(chuàng)建帶有屬性和方法的類:
In [46]:defecho_bar(self):#定義了一個普通的函數(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這個屬性
Out[48]:False
In [49]:
In [49]: hasattr(FooChild,'echo_bar')#判斷FooChild類中,是否有echo_bar這個屬性
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)建類的實例對象,元類就是類的類
在python中萬物皆對象,而且他們都是從一個類創(chuàng)建出來的,就是type
__metaclass__屬性
你首先寫下class Foo(object),但是類Foo還沒有在內存中創(chuàng)建。Python會在類的定義中尋找__metaclass__屬性,如果找到了,Python就會用它來創(chuàng)建類Foo,如果沒有找到,就會用內建的type來創(chuàng)建這個類。
classFoo(Bar):
? ? pass