- 論壇徽章:
- 0
|
本帖最后由 sardinescn 于 2013-07-17 23:48 編輯
還是跟重載有關(guān)系, 你的01.png里面就是在重載__getattr__()
我們先看db = client.mydb。這個(gè)地方的關(guān)鍵是為何能引用一個(gè)不存在的屬性。
看一個(gè)簡化的類定義- class B(object):
- pass
- y = B()
- print y.mydb
復(fù)制代碼 很明顯,print y.mydb 會(huì)拋出異常:AttributeError: 'B' object has no attribute 'mydb'
但我們?nèi)绻剌d__getattr__(), 就可以讓它沒有異常:- # override __getattr__
- class B(object):
- def __getattr__(self, name):
- return name
- y = B()
- print y.mydb
復(fù)制代碼 當(dāng)python解釋器遇到y(tǒng).mydb是,它首先到y(tǒng)的字典里面去查找mydb的屬性,如果查找不到,會(huì)調(diào)用__getattr__(), 默認(rèn)的__getattr__()應(yīng)該是空的, 所以找不到mydb這個(gè)屬性,拋出異常。 但是如果重載了__getattr__(), 上面的代碼是直接返回name, pymongo的代碼是創(chuàng)建一個(gè)collection并返回。 這樣就沒有異常了。 而且pymongo通過這種方式來創(chuàng)建一個(gè)collection.
接著再看db = client['mydb']
這里我們首先要解決的是怎樣通過下標(biāo)來獲取類屬性。- class A(object):
- def __init__(self):
- self.a = 1
- self.b = 2
- self.c = 3
- x = A()
- print x.a
- print x['a']
復(fù)制代碼 在執(zhí)行print x['a']的時(shí)候會(huì)拋出異常告訴你 class A is unsubscriptable.
我們可以重載__getitem__()使得能夠用下標(biāo)獲取類的屬性- class A(object):
- def __init__(self):
- self.a = 1
- self.b = 2
- self.c = 3
-
- def __getitem__(self, name):
- return self.__getattribute__(name)
復(fù)制代碼 這樣就可以了。
注意pymongo里面在__getitem__()中調(diào)用的是重載的__getattr__(), 所以db=client.mydb和db=client['mydb']就有相同的效果了。
|
|