python元類:type()
元類是python高階語法. 合理的使用可以減少大量重復性的代碼.
元類實際上做了以下三方面的工作:
- 干涉創建類的過程
- 修改類
- 返回修改之后的類
為什么使用元類?
為什么要使用元類這種模糊且容易出錯的功能?
一般情況下,我們並不會使用元類,99%的開發者並不會用到元類,所以一般不用考慮這個問題。
元類主用用於創建API,一個典型的例子就是Django的ORM。
它讓我們可以這樣定義一個類:
class Person(models.Model): name = models.CharField(max_length=30) age = models.IntegerField()
運行下面的代碼:
guy = Person(name='bob', age='35') print(guy.age)
返回的結果是int
類型而不是IntegerField
對象。這是因為models.Model
使用了元類,它會將Python中定義的字段轉換成數據庫中的字段。
通過使用元類,Django將復雜的接口轉換成簡單的接口。
原型:type(類名,基類元組(可以為空,用於繼承), 包含屬性或函數的字典)
以下兩種寫法都可以:
type('Class',(object,),dict(hello=fun()))
type('Class',(object,),{"hello":fun()})
1、class 自定義的類名稱
2、(object,)是繼承類,的元組,如果只有一個就寫這種形勢(object,);多個(object,xxxx,)
3、dict(hello=fun()) 或 {"hello":fun()} 第三個參數,是一個字典等號左是 自定義的方法名,右側是已寫好的方法名,這個要注意,有參數且沒有默認值的情況下,要加括號;
def fun(): print('hello world!') if __name__=="__main__": h = type('Hello',(object,),dict(hello=fun())) tc = h() tc.hello
引用:
h 相當於接收Hello類;tc = h()實例化類;tc.hello方法,調用的其實是我們定義的fun方法。
Hello = type('Hello',(object,),dict(hello=fun())) tc = Hello() tc.hello
type()動態創建類后,還可以添加更多的方法和屬性:
def mysql(): conn = pymysql.connect(host='127.0.0.1',port=3306 ,user='root' ,passwd='q123456' ,db='amsql' ) cur = conn.cursor() sql = "SELECT * FROM amt_case_interface_table" ret = cur.execute(sql) print(cur.fetchmany(3)) #conn.commit() cur.close() conn.close()
Hello.mysql = mysql()
調用:
tc.mysql
Linux and python學習交流1,2群已滿.
Linux and python學習交流3群新開,歡迎加入,一起學習.qq 3群:563227894
不前進,不倒退,停止的狀態是沒有的.
一起進步,與君共勉,