相关疑难解决方法(0)

为什么 setattr(super(), ...) 不等于 super().__setattr__(...)?

根据这个答案

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)

是什么赋予了?他们不应该做同样的事情吗?

python python-3.x

8
推荐指数
1
解决办法
2515
查看次数

在现有属性递增时调用__setattr__?

在现有属性递增时调用__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 overloading setattr

3
推荐指数
1
解决办法
956
查看次数

Python 2.7:object.__setattr__ 在幕后做了什么?

在 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__旧式类无法实现的新式类时,幕后发生了什么?

请注意,我没有将此代码用于任何目的,我只是想了解它。

python attributes class python-2.7 python-internals

2
推荐指数
1
解决办法
1969
查看次数