关于__dict__
我想问的是,为什么我在类中定义的变量无法用__dict__读取出,反而赋值了后才可以输出呢?
(抱歉用词不专业,讲的可能有些晦涩,但还是希望有大佬可以帮忙解答) 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:38 编辑
x、y 是类属性,不是实例属性,可以被所有实例对象所共享,所以,x、y 并不存在于 a . __dict__ 中,用 A . __dict__ 看看。 python爱好者. 发表于 2022-7-15 18:37
谢谢大佬懂了 jackz007 发表于 2022-7-15 18:37
x、y 是类属性,不是实例属性,可以被所有实例对象所共享,所以,x、y 并不存在于 a . __dict__ 中, ...
噢噢噢噢,懂了 jackz007 发表于 2022-7-15 18:37
x、y 是类属性,不是实例属性,可以被所有实例对象所共享,所以,x、y 并不存在于 a . __dict__ 中, ...
不过,既然a是A的实例,那x和y应该也是a的实例属性吧,有点疑惑 1872191836 发表于 2022-7-15 18:56
不过,既然a是A的实例,那x和y应该也是a的实例属性吧,有点疑惑
只有用 self.变量名 这种名名方式才能让其类对象的实例对象也用有次变量,比如在:
class a:
self.num = 100 #这里 self 就相当于以后的实例对象,所以就相当于后面实例对象拥有的变量。而去掉 self. 后就只能通过类对象访问了,因为他只会在类对象中创建一次,并不会在实例对象中也次次创建! 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]