我有一个包裹在另一个里面的物体。“包装器”通过重写从“包装”对象访问属性__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组件