我想知道 Foo.var= 用户输入和 self.var= 用户输入在 2 个类中有什么区别。
class foo():
var=None
def __init__(self,userinput):
foo.var=userinput
class bar():
var=None
def __init__(self,userinput):
self.var=userinput
foo
指类,self
指对象。
类成员是类的属性(因此在该类的所有对象之间共享),而实例成员是特定对象的属性,因此对实例成员的更改仅影响给定对象。
当您对一个对象进行操作时,它拥有的成员是类成员和实例成员的合并。当定义了两个同名成员时,实例成员具有优先权。
因此:
bar
设置实例变量;该更改仅对当前实例有效,因此如果您这样做:
b=bar(10)
c=bar(20)
你会看到那个c.var
is20
和b.var
is 10
; 这里没有什么奇怪的;
foo
设置一个类变量,它对所有实例都是通用的;所以,如果你这样做:
f=foo(10)
g=foo(20)
你会看到f.var
和g.var
will be 20
,因为它们实际上都引用了foo.var
,最后20
在g
的构造函数中设置为 ;
另一方面,实例变量隐藏类变量;所以,如果你这样做
f=foo(10)
g=foo(20)
f.var=30
你会有g.var==foo.var==20
, 但是f.var==30
, 因为 nowf.var
指的是实例变量f.var; 但是,如果你这样做
del f.var
现在实例(f
's)属性var
不再存在,因此f.var
再次引用类属性 var
(因此f.var==g.var==foo.var==20
)。
长话短说:通常你会想要使用self.var
(即实例成员);classname.var
仅用于在给定类的所有实例之间共享内容。
我想指出一个现有的帖子,它完美地解释了我认为的差异。
是的,
在第一个实例中,您正在为所有实例设置变量foo
this 是因为它是一个class
变量。
在第二种情况下,您只是为该实例设置变量foo
。
例如:
class pie():
def __init__(self, j):
pie.var = "pies" + str(j)
print (self.var)
def __str__(self):
return self.var
a = pie(1)
b = pie(2)
print (a)
print (b)