我想知道两个类中的Foo.var =用户输入和self.var = userinput之间的区别是什么。
class foo():
var=None
def __init__(self,userinput):
foo.var=userinput
class bar():
var=None
def __init__(self,userinput):
self.var=userinput
答案 0 :(得分:3)
foo
指的是类,self
指的是对象。
类成员是类的属性(因此在该类的所有对象之间共享),而实例成员是特定对象的属性,因此对实例成员的更改仅影响给定对象。
当您操作对象时,它拥有的成员是类成员和实例成员的合并。当定义了两个具有相同名称的成员时,实例成员具有优先级。
因此:
bar
设置实例变量;该更改仅对当前实例有效,因此如果您执行:
b=bar(10)
c=bar(20)
您会看到c.var
为20
而b.var
为10
;这里没什么奇怪的;
foo
设置一个类变量,这对所有实例都是通用的;所以,如果你这样做:
f=foo(10)
g=foo(20)
您会看到f.var
和g.var
都是20
,因为它们实际上都是foo.var
,最后设置为20
在g
的构造函数中;
另一方面,实例变量是阴影类变量;所以,如果你这样做
f=foo(10)
g=foo(20)
f.var=30
您将拥有g.var==foo.var==20
,但f.var==30
,因为现在f.var
指的是实例变量 f.var; 但,如果你这样做
del f.var
现在,实例(f
)的属性var
不再存在,因此f.var
再次引用类属性 var
(因此f.var==g.var==foo.var==20
)。
长话短说:通常你会想要self.var
(即实例成员); classname.var
仅用于在给定类的所有实例之间共享内容。
答案 1 :(得分:1)
我想指出一个现有的帖子,它在我看来完全解释了差异。
答案 2 :(得分:0)
是,
在第一个实例中,您要为foo
的所有实例设置变量,这是因为它是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)