我是一个Python新手有一个非常特别的痒来试验Python的点名称查找过程。 我如何代码“make.py”一个类或函数,使这些赋值语句成功地工作吗?
import make
make.a.dot.separated.name = 666
make.something.else.up = 123
make.anything.i.want = 777
我是一个Python新手有一个非常特别的痒来试验Python的点名称查找过程。 我如何代码“make.py”一个类或函数,使这些赋值语句成功地工作吗?
import make
make.a.dot.separated.name = 666
make.something.else.up = 123
make.anything.i.want = 777
#!/usr/bin/env python
class Make:
def __getattr__(self, name):
self.__dict__[name] = Make()
return self.__dict__[name]
make = Make()
make.a.dot.separated.name = 666
make.anything.i.want = 777
print make.a.dot.separated.name
print make.anything.i.want
特别__getattr__
当找不到一个名为值的方法被调用。 该生产线make.anything.i.want
结束了做等价的:
m1 = make.anything # calls make.__getattr__("anything")
m2 = m1.i # calls m1.__getattr__("i")
m2.want = 777
上述实现使用这些调用__getattr__
创造链Make
每个未知属性被访问时对象。 这允许点访问任意嵌套深,直到在该点处的实数值被分配的最终分配。
object.__getattr__(self, name)
当调用属性查询并没有发现常见的位置属性(即它不是一个实例属性,也不是在分类为发现
self
)。name
是属性名称。 此方法应该返回(计算)属性值或抛出一个AttributeError
异常。请注意,如果属性可以通过正常的机制,
__getattr__()
没有被调用。 (这是之间的故意不对称__getattr__()
和__setattr__()
这是为了提高效率,做到既因为否则__getattr__()
就没有办法访问实例的其他属性。 请注意,至少对于实例变量,你可以不插入的情况下任何值假总量控制属性字典(但将它们插入到另一个对象)。 见__getattribute__()
的方式来实际获得新的样式类总量控制方法不同。
object.__setattr__(self, name, value)
当属性分配试图调用。 这就是所谓的而不是正常的机构(即,存储在实例字典的值)。
name
是属性的名称,value
是要分配给它的值。如果
__setattr__()
要指定实例属性,它不应该简单地执行self.name = value
-这会导致递归调用本身。 相反,它应该插入实例的字典属性的值,例如,self.__dict__[name] = value
。 对于新式的类,而不是访问实例字典,它应该调用的基类的方法具有相同的名称,例如,object.__setattr__(self, name, value)
。