<class name =“”>之间的区别。 <var name =“”>和self。<var name =“”>在python类中</var> </var> </class>

时间:2013-04-08 23:11:02

标签: python class

我想知道两个类中的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

3 个答案:

答案 0 :(得分:3)

foo指的是self指的是对象

类成员是类的属性(因此在该类的所有对象之间共享),而实例成员是特定对象的属性,因此对实例成员的更改仅影响给定对象。

当您操作对象时,它拥有的成员是成员和实例成员的合并。当定义了两个具有相同名称的成员时,实例成员具有优先级。

因此:

  • bar设置实例变量;该更改仅对当前实例有效,因此如果您执行:

    b=bar(10)
    c=bar(20)
    

    您会看到c.var20b.var10;这里没什么奇怪的;

  • foo设置一个类变量,这对所有实例都是通用的;所以,如果你这样做:

    f=foo(10)
    g=foo(20)
    

    您会看到f.varg.var都是20,因为它们实际上都是foo.var,最后设置为20g的构造函数中;

  • 另一方面,实例变量是阴影类变量;所以,如果你这样做

    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)

我想指出一个现有的帖子,它在我看来完全解释了差异。

Python: Difference between class and instance attributes

答案 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)