问题标签 [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.

0 投票
4 回答
691 浏览

python - 可作为实例方法调用?

假设我们有一个元类CallableWrappingMeta,它遍历一个新类的主体,用一个类包装它的方法,InstanceMethodWrapper

我们的虚拟包装器只是在参数进入时打印它们。但是您会注意到一些明显的事情:该方法没有传递给实例对象接收器,因为即使InstanceMethodWrapper是可调用的,它也不会被视为函数在类创建期间转换为实例方法(在我们的元类完成之后)。

一个潜在的解决方案是使用装饰器而不是类来包装方法——该函数将成为实例方法。但在现实世界中,InstanceMethodWrapper情况要复杂得多:它提供 API 并发布方法调用事件。一个类更方便(并且性能更高,这并不重要)。

我也尝试了一些死胡同。子类化types.MethodTypetypes.UnboundMethodType没有去任何地方。稍加反省,似乎它们是从type. 所以我尝试将两者都用作元类,但也没有运气。可能是他们作为元类有特殊要求,但目前我们似乎处于无证领域。

有任何想法吗?

0 投票
1 回答
2072 浏览

python - python数据和非数据描述符

根据Python 的文档

__set__()带有和__get__()定义的数据描述符总是覆盖实例字典中的重新定义。

我理解这句话没有问题,但是有人可以为我澄清为什么会有这样的规则吗?毕竟,如果我想覆盖实例字典中的属性,我已经需要显式地执行此操作(inst.__dict__["attr"] = val),因为天真的inst.attr = val会调用描述符的__set__方法,这(通常)不会覆盖实例字典中的属性。

编辑:为了清楚起见,我了解正在发生的事情,我的问题是为什么要制定这样的规则。

0 投票
1 回答
770 浏览

python - 描述符和直接访问:Python 参考

python 3.3 文档告诉我应该可以直接访问属性描述符,尽管我对它的语法持怀疑态度x.__get__(a)。但是我在下面构建的示例失败了。我错过了什么吗?

这是我在 Python 2.7(以及移植代码片段后的 Python 3.2)中遇到的错误。该错误消息对我来说很有意义,但这似乎不是文档所说的那样。

0 投票
2 回答
2540 浏览

python - 获取描述符对象的好方法

在 Python 3 中

有更好的方法吗?我不喜欢这些self.__class__.__dict__东西

0 投票
2 回答
248 浏览

python - self 参数是如何神奇地传递给实例方法的?

我正在做代码学院流,我对 Ruby 有一点经验。我不明白为什么check_angles(self)函数需要self参数。

我感到困惑的原因是我不明白在调用时将 self 参数传递给函数的原因。似乎函数调用(代码块的最后一行)隐式传递了 self,但该函数需要将 self 显式定义为参数。

为什么是这样?

0 投票
1 回答
1589 浏览

python - 为什么在描述符类的 __get__ 中需要“如果实例为无”?

我从 Effective Python item 31 中得到以下示例:

我想不出有什么理由if instance is None: return self进去__get__Exam(或其他使用的潜在类Grade)实例如何None

0 投票
1 回答
1031 浏览

python - 了解 Python 描述符

我试图更好地理解描述符。

我不明白为什么在 foo 方法__get__中没有调用描述符方法。

据我了解描述符,__get__当我通过点运算符访问对象属性或使用__getattribute__().

根据Python 文档

0 投票
1 回答
1895 浏览

python - 如何将 super() 与一个参数一起使用?

在阅读 Python 文档时super(),我偶然发现了以下语句:

如果省略第二个参数,则返回的超级对象是未绑定的。

“未绑定”是什么意思以及如何super()与一个参数一起使用?

0 投票
3 回答
642 浏览

python - 为什么人们在 __get__ 中默认所有者参数为 None?

我经常看到这种情况:

为什么有些人Noneowner参数使用默认值?

这甚至在Python 文档中完成:

0 投票
1 回答
337 浏览

python - 将描述符添加到 Python 子类

我有一个继承优先级队列的python类,我还使用描述符向类添加属性,如下所示:

描述符是这样实现的:

当我打电话时,My_Class.my_attr = -1我没有任何异常。但是,如果我改成My_Class这个,我会得到异常:

有趣的是,第一个实现My_Classmy_attr属性开始,它只是不执行__set__函数NonNegativeInt.

为什么更改超类会改变我的描述符的工作方式?它是否与这条线有关:PriorityQueue.__init__(self)?我怎样才能给子类我想要的行为?