1872191836 发表于 2022-7-15 18:19:00

关于__dict__


我想问的是,为什么我在类中定义的变量无法用__dict__读取出,反而赋值了后才可以输出呢?
(抱歉用词不专业,讲的可能有些晦涩,但还是希望有大佬可以帮忙解答)

python爱好者. 发表于 2022-7-15 18:37:10

class A:
    x = 100
    y = 200
    def a(self):
      pass

A.__dict__ #直接通过类对象 (A) 才能获取,因为它是只在类对象 A 中定义的,除非你写 self.x = 100 才能这样访问
mappingproxy({'__module__': '__main__', 'x': 100, 'y': 200, 'a': <function A.a at 0x03419C40>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None})
a = A() #间接通过实例对象无法访问,需要在定义时变量名前加上 "self." !
a.__dict__
{}

jackz007 发表于 2022-7-15 18:37:10

本帖最后由 jackz007 于 2022-7-15 18:38 编辑

   x、y 是类属性,不是实例属性,可以被所有实例对象所共享,所以,x、y 并不存在于 a . __dict__ 中,用 A . __dict__ 看看。

1872191836 发表于 2022-7-15 18:54:28

python爱好者. 发表于 2022-7-15 18:37


谢谢大佬懂了

1872191836 发表于 2022-7-15 18:55:01

jackz007 发表于 2022-7-15 18:37
x、y 是类属性,不是实例属性,可以被所有实例对象所共享,所以,x、y 并不存在于 a . __dict__ 中, ...

噢噢噢噢,懂了

1872191836 发表于 2022-7-15 18:56:51

jackz007 发表于 2022-7-15 18:37
x、y 是类属性,不是实例属性,可以被所有实例对象所共享,所以,x、y 并不存在于 a . __dict__ 中, ...

不过,既然a是A的实例,那x和y应该也是a的实例属性吧,有点疑惑

python爱好者. 发表于 2022-7-15 20:06:13

1872191836 发表于 2022-7-15 18:56
不过,既然a是A的实例,那x和y应该也是a的实例属性吧,有点疑惑

只有用 self.变量名 这种名名方式才能让其类对象的实例对象也用有次变量,比如在:
class a:
    self.num = 100 #这里 self 就相当于以后的实例对象,所以就相当于后面实例对象拥有的变量。而去掉 self. 后就只能通过类对象访问了,因为他只会在类对象中创建一次,并不会在实例对象中也次次创建!

jackz007 发表于 2022-7-15 20:08:44

1872191836 发表于 2022-7-15 18:56
不过,既然a是A的实例,那x和y应该也是a的实例属性吧,有点疑惑

       对于 a 而言,类属性是只读的,就是说,虽然可以通过 a . x、a . y 访问到类属性,但是,却不可以通过类实例修改类属性,如果为 a . x、a . y 赋值,那么,将会为对象 a 创建新的实例属性 a . x、a . y,要想修改类属性,必须通过为 A . x、A . y 赋值来实现。
       当以 a . x 访问对象属性时,将优先考虑实例属性 a . x,如果实例属性不存在,才会考虑类的同名属性 A . x,如果都不存在,就会报错了。
页: [1]
查看完整版本: 关于__dict__