- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在查看 python 的描述 rune 档 here ,让我思考的陈述是:
对于物体,机械在 object.__getattribute__()
转换 b.x
进入 type(b).__dict__['x'].__get__(b, type(b))
在名为 Invoking Descriptors 的部分下.
声明的最后部分 b.x into type(b).__dict__['x'].__get__(b, type(b))
正在引起这里的冲突。根据我的理解,如果我们在一个实例上查找属性,那么 instance.__dict__
正在查找,如果我们没有找到任何东西 type(instance).__dict__
被引用。
在我们的示例中,b.x
然后应评估为:b.__dict__["x"].__get__(b, type(b))
而不是 type(b).__dict__['x'].__get__(b, type(b))
这种理解是否正确?或者我在解释的某个地方出错了?
任何解释都会有所帮助。
谢谢。
我还要添加第二部分:
为什么实例属性不遵守描述符协议(protocol)?例如:引用下面的代码:
>>> class Desc(object):
... def __get__(self, obj, type):
... return 1000
... def __set__(self, obj, value):
... raise AttributeError
...
>>>
>>> class Test(object):
... def __init__(self,num):
... self.num = num
... self.desc = Desc()
...
>>>
>>> t = Test(10)
>>> print "Desc details are ", t.desc
Desc details are <__main__.Desc object at 0x7f746d647890>
最佳答案
你的理解是错误的。 x
很可能根本没有出现在实例的字典中;描述符对象出现在类的字典或父类(super class)之一的字典中。
让我们举一个例子:
class Foo(object):
@property
def x(self):
return 0
def y(self):
return 1
x = Foo()
x.__dict__['x'] = 2
x.__dict__['y'] = 3
Foo.x
和
Foo.y
都是描述符。 (属性和函数都实现了描述符协议(protocol)。)
x.x
:
>>> x.x
0
x
得到值的命令。相反,因为 Python 找到了名称为
x
的数据描述符。在
Foo.__dict__
,它调用
Foo.__dict__['x'].__get__(x, Foo)
x.y
:
>>> x.y
3
__set__
或
__delete__
,所以实例 dict 会覆盖它们。
class Foo(object):
@property
def bar(self):
return 4
Foo.bar = 3
Foo.bar
会在
Foo
中找到一个描述符的字典和电话
Foo.__dict__['bar'].__set__
.
__set__
描述符的方法必须处理在类和实例上设置属性,并且它必须以某种方式区分差异,即使面对元类也是如此。以这种方式使协议(protocol)复杂化并没有令人信服的理由。
关于Python 描述符 - 文档不清楚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21573967/
MVC3 中的助手是否在 Controller 和 View 中使用? 助手是放置常用 Controller 方法的正确位置吗? 我想创建一个通用方法来获取数据库中的所有子子 ID,并确保它位于正确的
有人可以阐明这两者之间的区别吗,因为它们存在于执行上下文中?我很难阅读 ECMA 262 v 5规范并清楚地看到差异。 谢谢你, 最佳答案 两者都是执行上下文的组件(相同类型),但它们有不同的用途(f
我是一名优秀的程序员,十分优秀!