- 论坛徽章:
- 0
|
本帖最后由 sardinescn 于 2013-07-17 23:48 编辑
还是跟重载有关系, 你的01.png里面就是在重载__getattr__()
我们先看db = client.mydb。这个地方的关键是为何能引用一个不存在的属性。
看一个简化的类定义- class B(object):
- pass
- y = B()
- print y.mydb
复制代码 很明显,print y.mydb 会抛出异常:AttributeError: 'B' object has no attribute 'mydb'
但我们如果重载__getattr__(), 就可以让它没有异常:- # override __getattr__
- class B(object):
- def __getattr__(self, name):
- return name
- y = B()
- print y.mydb
复制代码 当python解释器遇到y.mydb是,它首先到y的字典里面去查找mydb的属性,如果查找不到,会调用__getattr__(), 默认的__getattr__()应该是空的, 所以找不到mydb这个属性,抛出异常。 但是如果重载了__getattr__(), 上面的代码是直接返回name, pymongo的代码是创建一个collection并返回。 这样就没有异常了。 而且pymongo通过这种方式来创建一个collection.
接着再看db = client['mydb']
这里我们首先要解决的是怎样通过下标来获取类属性。- class A(object):
- def __init__(self):
- self.a = 1
- self.b = 2
- self.c = 3
- x = A()
- print x.a
- print x['a']
复制代码 在执行print x['a']的时候会抛出异常告诉你 class A is unsubscriptable.
我们可以重载__getitem__()使得能够用下标获取类的属性- class A(object):
- def __init__(self):
- self.a = 1
- self.b = 2
- self.c = 3
-
- def __getitem__(self, name):
- return self.__getattribute__(name)
复制代码 这样就可以了。
注意pymongo里面在__getitem__()中调用的是重载的__getattr__(), 所以db=client.mydb和db=client['mydb']就有相同的效果了。
|
|