当前位置: 首页 > 面试题库 >

为什么在定义为实例属性时未调用描述符?

薛扬
2023-03-14
问题内容

当我将“数据”变量设为类变量时,以下工作有效,但是当我将其变为对象变量时,则不会调用描述符。请帮忙。

class Data(object):
    products = {
        'milk': {'price': 1.50, 'quantity': 10},
        'eggs': {'price': 0.20, 'quantity': 100},
        'cheese': {'price': 2.00, 'quantity': 10}
    }
    def __get__(self, obj, klas):
        print "Here in descriptor"
        return self.products

class BusinessLogic(object):
    def __init__(self):         # When I remove these 2 lines 
        self.data = Data()
    #data = Data()             # and enable this line it does work !

def main():
    b = BusinessLogic()
    b.data

if __name__ == '__main__':
    main()

问题答案:

这是因为描述符仅应定义为类属性,而不是实例属性:

从文档:

以下方法仅在包含该方法的类的实例(所谓的描述符类)出现在所有者类中( 描述符必须位于所有者的类字典或父类的父类的类字典中 )时适用。

为了使描述符也能与实例属性一起使用,您需要重写。__getattribute__方法BusinessLogic(尚未进行全面测试,但可以根据情况工作):

def __getattribute__(self, attr):
        obj = object.__getattribute__(self, attr)
        if hasattr(obj, '__get__'):
            return obj.__get__(self, type(self))
        return obj

如果您有数据描述符,则还需要处理该__setattr__零件。

def __setattr__(self, attr, val):
    try:
        obj = object.__getattribute__(self, attr)
    except AttributeError:
        # This will be raised if we are setting the attribute for the first time
        # i.e inside `__init__` in your case.
        object.__setattr__(self, attr, val)
    else:
        if hasattr(obj, '__set__'):
            obj.__set__(self, val)
        else:
            object.__setattr__(self, attr, val)


 类似资料:
  • 问题内容: 描述符对象需要存在于类中,而不是存在于实例中 因为那是实现的方式。 一个简单的例子。考虑一个描述符: 考虑每个obj具有多个Prop的情况:我将需要使用唯一的名称来标识值和乘数(如此处。具有每个实例的描述符对象将允许将(和)存储在描述符本身中,从而简化了几样东西。 我知道以前也曾提出过类似的问题,但我没有找到真正的解释: 为什么以这种方式设计Python? 建议使用哪种方式存储描述符需

  • ReferenceError:未定义测试 我被困在这里了。我该如何解决这个问题。还有一个问题。消化和摩卡有关系吗?请谁来帮我解决这个问题

  • 问题内容: 我正在尝试定义一些端点并使用进行测试。在我有: 并在: 现在,我正在尝试使用此端点: 但是,当我运行时,出现此错误: 我该如何解决该问题? 问题答案: 假设您通过进行测试,则必须使用命令而不是可执行文件运行测试。 因此,如果您还没有这样做,请确保您已这样做。然后,只需在项目的根目录中运行即可。

  • 我得到以下错误时运行我的测试用例摩卡 有人知道为什么会这样吗? 包裹json physicalperson.spec.js 我所尝试的 我在SO中看到了一些线程,我也尝试了下面的代码,但出现了相同的错误。

  • 本文向大家介绍Windows Powershell属性:描述对象是什么,包括了Windows Powershell属性:描述对象是什么的使用技巧和注意事项,需要的朋友参考一下 属性可以描述一个对象,对象的属性可以被Powershell自动转换成文本,并且输出到控制台。因此可以通过这种方法查看任何对象,例如$host: InternalHost对象存储在$host变量中,包含9个属性。输出的第一列为

  • 问题内容: 因此,我使用的所有自定义数据属性都应以“ data-”开头: 如果我不理会这会发生什么不好的事情?即: 我想一件坏事是我的自定义属性可能与具有特殊含义(例如)的HTML属性发生冲突,但是除此之外,仅编写“ example_text”而不是“data-example_text”是否有问题?(它不会验证,但是谁在乎呢?) 问题答案: 保留自定义属性以data- *为前缀有几个好处。 它保证