Pymongo数据库对象客户端具有任何属性



我正在通过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 __()?

最新更新