亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 3019 | 回復(fù): 3
打印 上一主題 下一主題

一個(gè)python instance屬性的問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2013-07-17 16:25 |只看該作者 |倒序?yàn)g覽

今天看了一下MongoDB的python driver - pymongo,連接數(shù)據(jù)庫的代碼是

from pymongo import MongoClient

client = MongoClient('127.0.0.1', 27017)

接下來要獲得一個(gè)Database的實(shí)例
db = client.mydb
或者
db = client['mydb']

'mydb'是db名字,

這里我就搞不懂了, client是pymongo.mongo_client.MongoClient的實(shí)例,
>>> type(client)
<class 'pymongo.mongo_client.MongoClient'>

對于db = client.mydb, mydb應(yīng)該是實(shí)例屬性, 但事實(shí)上實(shí)例并沒有這個(gè)屬性。 比如,db server端沒有mydb這個(gè)db,也可以這樣寫,然后可以insert創(chuàng)建一個(gè)名為‘mydb’的新db。

對于db = client['mydb'], 這個(gè)就更困惑了。

請教一下這是使用的python的什么功能才能做到這個(gè)?

多謝

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2013-07-17 17:41 |只看該作者
明白了,是Database類重載了__getattr__()就可以了。

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2013-07-17 21:40 |只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2013-07-17 22:46 |只看該作者
本帖最后由 sardinescn 于 2013-07-17 23:48 編輯

還是跟重載有關(guān)系, 你的01.png里面就是在重載__getattr__()

我們先看db = client.mydb。這個(gè)地方的關(guān)鍵是為何能引用一個(gè)不存在的屬性。
看一個(gè)簡化的類定義
  1. class B(object):
  2.     pass

  3. y = B()
  4. print y.mydb  
復(fù)制代碼
很明顯,print y.mydb 會(huì)拋出異常:AttributeError: 'B' object has no attribute 'mydb'

但我們?nèi)绻剌d__getattr__(), 就可以讓它沒有異常:
  1. # override __getattr__
  2. class B(object):
  3.     def __getattr__(self, name):
  4.         return name

  5. y = B()
  6. 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)來獲取類屬性。
  1. class A(object):
  2.     def __init__(self):
  3.         self.a = 1
  4.         self.b = 2
  5.         self.c = 3

  6. x = A()
  7. print x.a
  8. print x['a']
復(fù)制代碼
在執(zhí)行print x['a']的時(shí)候會(huì)拋出異常告訴你 class A is unsubscriptable.
我們可以重載__getitem__()使得能夠用下標(biāo)獲取類的屬性
  1. class A(object):
  2.     def __init__(self):
  3.         self.a = 1
  4.         self.b = 2
  5.         self.c = 3
  6.         
  7.     def __getitem__(self, name):
  8.         return self.__getattribute__(name)
復(fù)制代碼
這樣就可以了。

注意pymongo里面在__getitem__()中調(diào)用的是重載的__getattr__(), 所以db=client.mydb和db=client['mydb']就有相同的效果了。


您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP