根据这个答案:
setattr(instance, name, value)是语法糖instance.__setattr__(name, value)
但:
class C:
def __init__(self):
# OK.
super().__setattr__("foo", 123)
# AttributeError: 'super' object has no attribute 'foo'
setattr(super(), "foo", 123)
c = C()
Run Code Online (Sandbox Code Playgroud)
是什么赋予了?他们不应该做同样的事情吗?
在现有属性递增时调用__setattr__?
我有一个名为C的类,我正在尝试重载__setattr__.这是C类内部的一段代码:
class C:
def bump(self):
self.a += 1
self.b += 1
self.c += 1
def __setattr__(self,name,value):
calling = inspect.stack()[1]
if 'private_' in name:
raise NameError("\'private_\' is in the variable name.")
elif '__init__' in calling.function:
self.__dict__['private_' + name] = value
elif name.replace('private_', '') in self.__dict__:
if self.in_C(calling):
if name.replace('private_', '') in self.__dict__.keys():
old_value = self.__dict__[name.replace('private_', '')]
new_value = old_value + value
self.__dict__[name.replace('private_', '')] = new_value
else:
self.__dict__[name.replace('private_','')] = value
else:
raise NameError()
else:
self.__dict__[name] = value …Run Code Online (Sandbox Code Playgroud) 在 Python 2.7 中,我可以声明一个新样式的类并使用object.__setattr__以下方法设置一个属性:
class A (object):
def __init__ (self):
object.__setattr__(self, 'foo', 'bar')
A().foo # 'bar'
Run Code Online (Sandbox Code Playgroud)
但是,这在旧式类中不起作用:
class B:
def __init__ (self):
object.__setattr__(self, 'foo', 'bar')
B().foo
Run Code Online (Sandbox Code Playgroud)
类型错误:不能将此 __setattr__ 应用到实例对象
我知道旧式类不支持这种行为,但我不知道为什么它不起作用。
当我调用object.__setattr__旧式类无法实现的新式类时,幕后发生了什么?
请注意,我没有将此代码用于任何目的,我只是想了解它。