我正在通过pymongo教程,我不理解一件事。
我们表明我们可以创建这样的数据库集合:
>>>client = MongoClient()
>>>print(client)
MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True)
>>>db = client.test_database
>>>print(db)
Database(MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True), 'test_database')
>>>collection = db.test_collection #posts is the collection.
>>>print(collection)
Collection(Database(MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True), 'test_database'), 'test_collection')
我最初的想法是:"他们是否确保为客户端包含一个 test_database
属性和数据库的test_collection
属性只是为了使其与教程一起使用吗?"但是进一步的实验表明,我可以使用任何"属性名称"以这种方式创建数据库和收藏夹!例如:
>>>client = MongoClient()
>>>db = client.foo
>>>print(db)
Database(MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True), 'foo')
>>>collection = db.bar
>>>print(collection)
Collection(Database(MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True), 'foo'), 'bar')
这在Python中如何起作用?我试图通过阅读GitHub存储库中的Pymongo文件来理解它,但是新手很难理解。
mongoclient覆盖了"魔术"方法__getattr__
。每当您访问实际上不是对象的属性或属性(例如,访问" test_database")的羊毛coc仪对象上的属性时,python解释器会调用:
client.__getattr__("test_database")
MongoClient.__getattr__
的实现然后创建一个数据库对象并将其返回。
数据库还覆盖__getattr__
以返回带有任何名称的集合。
两个类也覆盖__getitem__
,以便括号的访问作品:
client["test_database"]
请参阅此处的__getattr__
文档。
您需要在类中实现__getattr__
方法才能使其起作用。
简单地说 - 每当您访问类未定义的属性时,__getattr__
方法都会被调用(实际上它更复杂)。请参阅下面的示例:
class Database(object):
def __init__(self, host):
self.host = host
def __getattr__(self, name):
return Collection(name)
class Collection(object):
def __init__(self, name):
self.name = name
def __repr__(self):
return '<Collection name={0}>'.format(self.name)
>>> db = Database('www.example.com')
>>> db.host
'example.com'
>>> db.foo
<Collection name=foo>
>>> db.bar
<Collection name=bar>
您可以在此处阅读有关__getattr__
的更多信息:Python:如何实现__getAttr __()?