当前位置: 首页 > 知识库问答 >
问题:

求助,急,关于python的类属性__slots__,为什么修改类属性影响实例?

欧阳炜
2023-06-05
class Person:
    __slots__ = ("name")
    def __init__(self):
        self.name=13
shili=Person()
print(shili.name)
# Person.name = 143
print(id(shili.name),id(Person.name))

Person.name = 143
print(id(shili.name),id(Person.name))
shili.name=13

我有以上代码,为什么修改类属性影响实例属性?有人会说这是由于实例共享类属性,根据mro属性解析顺序是如此,但是这是在实例命名空间没有要搜索的属性时才会访问类的命名空间,在我的代码中,实例(shili)有自己的name属性,但为什么还是共享类属性呢?或者说这是其他什么问题,求大佬解答

共有1个答案

凌清夷
2023-06-05

这里有一个知识点,可以记笔记:在 Python 中,实例属性和类属性都是存储在对象的命名空间中的,默认情况下,实例属性会覆盖同名的类属性。

我们以你的这段代码为例,阐释每一段代码的含义从而有利于更好理解,我们首先定义了一个类 Person,其中包含一个类属性 name,并且使用 slots 限制了实例属性。创建 shili 实例后,我们访问实例的 name 属性,这时实例并没有自己的 name 属性,因为在初始化时它只能拥有 slots 中指定的属性。所以,Python 会到 shili 对象所属的类 Person 中查找属性 name,然后输出其值 13。

接着,我们将类属性 name 修改为 143,此时 shili 实例的 name 属性并未被修改,因为实例属性会覆盖同名的类属性。但是,我们打印出了 shili.name 的内存地址和 Person.name 的内存地址,发现它们的内存地址相同,这说明 shili 实例的 name 属性实际上是类属性的引用。因此,当我们再次访问 shili.name 时,它实际上是访问的类属性,因此输出结果为 143。这是因为 Python 中,类属性在各个实例之间是共享的,因为它们都指向同一个内存地址。

真诚的希望我的回答能帮到您!

 类似资料:
  • 主要内容:类变量(类属性),实例变量(实例属性),局部变量无论是类属性还是类方法,都无法像普通变量或者函数那样,在类的外部直接使用它们。我们可以将类看做一个独立的空间,则类属性其实就是在类体中定义的变量,类方法是在类体中定义的函数。 前面章节提到过,在类体中,根据变量定义的位置不同,以及定义的方式不同,类属性又可细分为以下 3 种类型: 类体中、所有函数之外:此范围定义的变量,称为类属性或类变量; 类体中,所有函数内部:以“self.变量名”的方式定义的

  • 问题内容: 我是python的新手,了解到类属性就像C ++中的静态数据成员一样。但是,尝试以下代码后,我感到困惑: f2.a是否也等于5? 如果将a定义为列表而不是整数,则预期行为: 我研究了 Python:类和实例属性之间的区别,但是它不能回答我的问题。 谁能解释为什么会有所不同?谢谢 问题答案: 在第二个示例中,您没有做相同的事情。在第一个示例中,您要分配一个新值: 在第二个示例中,您只是在

  • 下表列出了 4 个常见的明星人物: 姓名 年龄 周润发 58 成龙 55 刘德华 53 周星驰 54 进行归纳总结: 这些人物具有较高的知名度,把这些人物归类为明星; 每个明星两个属性:姓名和年龄。明星这个群体具有一个属性:数量,在这张表格中,明星的数量是 4; 姓名和年龄等属性是用于描述具体的一个对象(例如:周润发),而人物的数量是用于描述明星这个类别。 如果使用面向对象技术对以上实体进行描述,

  • 上面的代码准备好了两个类,请看表演 接着来

  • 如何使类示例推断类型基于实例值检查: 打字沙盒。

  • 1、从内部增加和修改类属性 来,我们先来温习一下类的结构。 看着这个结构,提一个问题,如何修改类属性,也就是类里面的变量? 从类结构来看,我们可以猜测,从类方法来修改,也就是从类内部来修改和增加类属性。 看下具体的实例: 这里还是强调一下,例子还是要自己多写,不要只看,自己运行, 看效果。多想。 2、从外部增加和修改类属性 我们刚刚看了通过类方法来修改类的属性,这时我们看下从外部如何修改和增加类属