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

'super'对象未调用__getattr__

唐珂
2023-03-14
问题内容

我有一个包裹在另一个里面的物体。“包装器”通过重写从“包装”对象访问属性__getattr__。直到我需要重写子类上的属性,然后使用来从基类访问该属性之前,此方法都有效super()

我仍然可以直接从中访问属性,__getattr__但是为什么不起作用super()

class Wrapped(object):
    def __init__(self, value):
        self.value = value

    def hello_world(self):
        print 'hello world', self.value

class Wrapper(object):
    def __init__(self, obj):
        self.wrapped_obj = obj

    def __getattr__(self, name):
        if name in self.__dict__:
            return getattr(self, name)
        else:
            return getattr(self.wrapped_obj, name)

class Subclass(Wrapper):
    def __init__(self, obj):
        super(Subclass, self).__init__(obj)

    def hello_world(self):
        # this works
        func = super(Subclass, self).__getattr__('hello_world')()
        # this doesn't
        super(Subclass, self).hello_world()

a = Wrapped(2)
b = Subclass(a)
b.hello_world()

问题答案:

据此,
super不允许隐式调用诸如的“
hook”函数__getattr__。我不确定为什么要用这种方式实现(这可能是一个很好的理由,并且由于超级对象具有自定义__getattribute____get__方法,所以事情已经很混乱了),但似乎事情就是这样。

编辑:这篇文章似乎清除了一些东西。看起来问题在于,__getattribute__隐式调用函数时,由引起的额外的间接层将被忽略。做foo.x等同于

foo.__getattr__(x)

(假设__getattribute__未定义任何方法,并且x不在in foo.__dict__)但是,它不等于

foo.__getattribute__('__getattr__')(x)

由于super返回一个代理对象,因此它具有一个额外的间接层,这会导致事务失败。

PS完全不需要self.__dict__检查__getattr__功能。__getattr__仅当字典中不存在该属性时才调用。(__getattribute__如果您希望始终调用它,则可以使用它,但是您必须非常小心,因为即使是简单的东西if name in self.__dict__也会导致无限递归。



 类似资料:
  • 问题内容: 您何时在Java中调用super()?我在派生类的某些构造函数中看到了它,但是不是每个父类的构造函数都会自动调用吗?为什么需要使用超级? 问题答案: 如果您提供这样的课程: 或这个: 编译器将为此生成代码: 因此,严格来说,对“ super()”的调用始终存在。 在实践中,您仅应在要传递给父构造函数的参数处调用“ super(…)”。 调用“ super()”(没有参数)并没有错,但是

  • 我试图在我的数据库中保存一个json对象。未调用save()函数,但从未保存json对象。帮我解决这个问题。我想这是猫鼬的连接问题。这是我的密码。。 我的控制台日志:: 新增用户api命中!!json的内容是: 143没有userrs: 144 db中的用户计数已更新!!这个人生成的id是:ipkoID_C144调用保存函数obj::{"name":"Abhi","密码":"jio","usern

  • 如何验证一个模拟对象根本没有被调用?我正在尝试使用Mockito测试一个接口方法的空实现。

  • 问题内容: 假设我有以下课程: 我想知道是否传递以下构造函数很重要: 我当前的代码工作正常,但是我想知道这是否是一个好习惯。 问题答案: 根据React团队的Ben Alpert的说法,如果您打算在构造函数内部使用,则仅需要将prop传递给构造函数。调用构造函数后,React从外部将props附加到组件。

  • 我在Spring靴中使用泽西岛。我有一个 ,则调用< code > my exception mapper . to response()。 但是,如果我的应用程序抛出一个,那么即使我的ExceptionMapper是一个ExceptionMapper,也不会调用它 我假设泽西有一个默认的,它正在处理(我假设)。我如何自定义这个? 我真正想做的是在任何< code>Throwable的情况下添加调

  • 我有以下功能组件 由于某些原因,没有应用我的内联样式(正在应用我的类)。有人知道为什么吗? 我尝试在下面的组件中呈现Note组件