问题标签 [python-descriptors]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 可作为实例方法调用?
假设我们有一个元类CallableWrappingMeta
,它遍历一个新类的主体,用一个类包装它的方法,InstanceMethodWrapper
:
我们的虚拟包装器只是在参数进入时打印它们。但是您会注意到一些明显的事情:该方法没有传递给实例对象接收器,因为即使InstanceMethodWrapper
是可调用的,它也不会被视为函数在类创建期间转换为实例方法(在我们的元类完成之后)。
一个潜在的解决方案是使用装饰器而不是类来包装方法——该函数将成为实例方法。但在现实世界中,InstanceMethodWrapper
情况要复杂得多:它提供 API 并发布方法调用事件。一个类更方便(并且性能更高,这并不重要)。
我也尝试了一些死胡同。子类化types.MethodType
并types.UnboundMethodType
没有去任何地方。稍加反省,似乎它们是从type
. 所以我尝试将两者都用作元类,但也没有运气。可能是他们作为元类有特殊要求,但目前我们似乎处于无证领域。
有任何想法吗?
python - python数据和非数据描述符
根据Python 的文档,
__set__()
带有和__get__()
定义的数据描述符总是覆盖实例字典中的重新定义。
我理解这句话没有问题,但是有人可以为我澄清为什么会有这样的规则吗?毕竟,如果我想覆盖实例字典中的属性,我已经需要显式地执行此操作(inst.__dict__["attr"] = val
),因为天真的inst.attr = val
会调用描述符的__set__
方法,这(通常)不会覆盖实例字典中的属性。
编辑:为了清楚起见,我了解正在发生的事情,我的问题是为什么要制定这样的规则。
python - 描述符和直接访问:Python 参考
python 3.3 文档告诉我应该可以直接访问属性描述符,尽管我对它的语法持怀疑态度x.__get__(a)
。但是我在下面构建的示例失败了。我错过了什么吗?
这是我在 Python 2.7(以及移植代码片段后的 Python 3.2)中遇到的错误。该错误消息对我来说很有意义,但这似乎不是文档所说的那样。
python - 获取描述符对象的好方法
在 Python 3 中
有更好的方法吗?我不喜欢这些self.__class__.__dict__
东西
python - self 参数是如何神奇地传递给实例方法的?
我正在做代码学院流,我对 Ruby 有一点经验。我不明白为什么check_angles(self)
函数需要self
参数。
我感到困惑的原因是我不明白在调用时将 self 参数传递给函数的原因。似乎函数调用(代码块的最后一行)隐式传递了 self,但该函数需要将 self 显式定义为参数。
为什么是这样?
python - 为什么在描述符类的 __get__ 中需要“如果实例为无”?
我从 Effective Python item 31 中得到以下示例:
我想不出有什么理由if instance is None: return self
进去__get__
。Exam
(或其他使用的潜在类Grade
)实例如何None
?
python - 了解 Python 描述符
我试图更好地理解描述符。
我不明白为什么在 foo 方法__get__
中没有调用描述符方法。
据我了解描述符,__get__
当我通过点运算符访问对象属性或使用__getattribute__()
.
根据Python 文档:
python - 将描述符添加到 Python 子类
我有一个继承优先级队列的python类,我还使用描述符向类添加属性,如下所示:
描述符是这样实现的:
当我打电话时,My_Class.my_attr = -1
我没有任何异常。但是,如果我改成My_Class
这个,我会得到异常:
有趣的是,第一个实现My_Class
从my_attr
属性开始,它只是不执行__set__
函数NonNegativeInt
.
为什么更改超类会改变我的描述符的工作方式?它是否与这条线有关:PriorityQueue.__init__(self)
?我怎样才能给子类我想要的行为?