Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么只在新样式类中使用object.\uuuuu setattr\uuuuu(self、name、value)?_Python_Class_Inheritance_Setattr_New Style Class - Fatal编程技术网

Python 为什么只在新样式类中使用object.\uuuuu setattr\uuuuu(self、name、value)?

Python 为什么只在新样式类中使用object.\uuuuu setattr\uuuuu(self、name、value)?,python,class,inheritance,setattr,new-style-class,Python,Class,Inheritance,Setattr,New Style Class,根据Python 2.7.12文档: 如果\uuuu setattr\uuuu()想要分配给实例属性,它应该 不仅仅是执行self.name=value——这将导致递归 自言自语。相反,它应该在字典中插入值 实例属性,例如,self.\uuu dict\uuu[name]=value用于 新样式的类,而不是访问实例字典,它 应该使用相同的名称调用基类方法,例如, object.\uuuuu setattr\uuuuuu(自我、名称、值) 但是,以下代码的工作原理与预期相同: class Clas

根据Python 2.7.12文档:

如果
\uuuu setattr\uuuu()
想要分配给实例属性,它应该 不仅仅是执行
self.name=value
——这将导致递归 自言自语。相反,它应该在字典中插入值 实例属性,例如,
self.\uuu dict\uuu[name]=value
用于 新样式的类,而不是访问实例字典,它 应该使用相同的名称调用基类方法,例如,
object.\uuuuu setattr\uuuuuu(自我、名称、值)

但是,以下代码的工作原理与预期相同:

class Class(object):
    def __setattr__(self, name, val):
        self.__dict__[name] = val;

c = Class()
c.val = 42
print c.val
我知道
super(Class,obj)。\uuuuuuSetAttr\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu(name,value)
可以确保所有要调用的基类的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。那么,为什么只建议新样式的课程使用它呢


或者,另一方面,为什么经典类不建议这样做?

新样式类可能使用插槽,此时没有要分配的
\uuuu dict\uu
。新样式类还支持其他数据描述符,即在类上定义的对象,用于处理某些名称的属性设置或删除

从:

默认情况下,新旧样式类的实例都有一个用于属性存储的字典。这会为实例变量很少的对象浪费空间。创建大量实例时,空间消耗可能会变得非常严重

可以通过在新样式的类定义中定义
\uuuuuuuuuuuuuuuuuuuuuuuuuuuu
来覆盖默认值。
\uuuuuuuuuuuuuuuuuuuuuuuu
声明获取一系列实例变量,并在每个实例中保留足够的空间来保存每个变量的值。节省空间是因为没有为每个实例创建
\uuu dict\uu

而通过在类上添加来实现对插槽的访问;对于每个这样的属性,具有
\uuuuu set\uuuuu
和/或
\uuuu del\uuuuu
方法的对象

数据描述符的另一个示例是附加了setter或deleter函数的数据描述符。在
\uuuuu dict\uuu
中设置与描述符对象同名的键将被忽略,因为数据描述符会导致属性查找完全绕过
\uuuu dict\uuu


对象。
知道如何处理数据描述符,这就是为什么您应该调用它。

新样式的类可以使用插槽,在这一点上没有要分配的
\uu dict\uu
。新样式类还支持其他数据描述符,即在类上定义的对象,用于处理某些名称的属性设置或删除

从:

默认情况下,新旧样式类的实例都有一个用于属性存储的字典。这会为实例变量很少的对象浪费空间。创建大量实例时,空间消耗可能会变得非常严重

可以通过在新样式的类定义中定义
\uuuuuuuuuuuuuuuuuuuuuuuuuuuu
来覆盖默认值。
\uuuuuuuuuuuuuuuuuuuuuuuu
声明获取一系列实例变量,并在每个实例中保留足够的空间来保存每个变量的值。节省空间是因为没有为每个实例创建
\uuu dict\uu

而通过在类上添加来实现对插槽的访问;对于每个这样的属性,具有
\uuuuu set\uuuuu
和/或
\uuuu del\uuuuu
方法的对象

数据描述符的另一个示例是附加了setter或deleter函数的数据描述符。在
\uuuuu dict\uuu
中设置与描述符对象同名的键将被忽略,因为数据描述符会导致属性查找完全绕过
\uuuu dict\uuu


object.\uuuu setattr\uuuuu()
知道如何处理数据描述符,这就是为什么您应该直接调用它。

那么为什么只建议对新样式类使用它呢?调用
\uuuu setattr\uuuu
而不是直接对实例字典进行操作,可以让超类对正在发生的事情进行一些“监督”。可以将此方法视为新样式类的优势。可能会建议所有类都使用它,但不继承的旧式类没有可调用的超类。@jedwards是的,因为没有
classobj.\uu setattr\uuuuuuuuuuuuu>用于经典类,只有
对象。\uu setattr\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
用于新样式类。你完全正确。我的观点是,我看了你用粗体写的句子,与其说是不鼓励直接使用实例dict(正如你所展示的,它在许多情况下工作得非常好,正如Martijn所展示的,有些情况下它不会),不如说是鼓励你使用
\uuu setattr\uuu
,它允许超类进行一些监督,并使用描述符等更新的特性。抱歉,如果我不清楚:)那么为什么只建议新样式的类使用它呢?调用
\uuuu setattr\uuuu
而不是直接对实例字典进行操作,可以让超类对正在发生的事情进行一些“监督”。可以将此方法视为新样式类的优势。可能会建议所有类都使用它,但不继承的旧式类没有可调用的超类。@jedwards是的,因为没有
classobj.\uu setattr\uuuuuuuuuuuuu>用于经典类,只有
对象。\uu setattr\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
用于新样式类。你完全正确。我的观点是,我看了你用粗体写的句子,与其说是不鼓励直接使用实例dict(正如你所展示的,它在许多情况下工作得非常好,正如Martijn所展示的,有些情况下它不会),不如说是鼓励你使用
\uuu setattr\uuu
,它允许超类进行一些监督,并使用描述符等更新的特性。对不起,如果我