【问题标题】:Python: test descriptors assigned correctlyPython:正确分配的测试描述符
【发布时间】:2017-09-24 03:33:08
【问题描述】:

考虑这个例子:

>>> class Bar(object):
...     
...     def __init__(self, name):
...         self.name = name
...     def __set__(self, instance, value):
...         setattr(instance, self.name, value)
...     def __get__(self, instance, owner):
...         return getattr(instance, self.name, owner)
...     
>>> class Foo(object):
...     bat = Bar('bat')
...     
>>> Foo.bat
<class 'Foo'>
>>> type(Foo.bat)
<class 'type'>  # how would you get <class 'Bar'> ?

我想写一些pytests 断言正确的描述符已分配给正确的属性。

但是一旦分配了描述符,我似乎无法检查它的类型

【问题讨论】:

  • 为什么foo.bat 不会导致 StackOverflow 错误?
  • @MadPhysicist: Foo.batNone 作为 instance 传递给 __get__

标签: python descriptor


【解决方案1】:

我不确定您要对描述符做什么,但通常您希望在未传递实例时将描述符本身传回:

class Bar(object):
    def __init__(self, name):
        self.name = name
    def __set__(self, obj, value):
        setattr(obj, self.name, value)
    def __get__(self, obj, cls):
        if obj is None:
            return self
        return getattr(obj, self.name)

class Foo(object):
    bat = Bar('bat')

Foo.bat
# <__main__.Bar at 0x7f202accbf50>

【讨论】:

  • 只是执行一些类型/域检查。也许我的 RTFM 不够……但这是有道理的。
  • 你可能想对Foo().bat保持警惕。未经测试,但我怀疑它会触发所写的无限递归。
【解决方案2】:

您可以使用vars(Foo)['bat'] 覆盖通常的查找(它使用您试图查看的描述符,无论您是否在结果上调用type)。

【讨论】:

  • 不错!谢谢,这真的让我难过。你的简单解释很有道理
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多