类__init __()函数内部和外部的variables

我试着去了解,除了这个名字之外,这两个类之间还有什么不同吗? 如果在声明variables“value”时使用或不使用__init __()函数,它会有什么区别吗?

class WithClass (): def __init__(self): self.value = "Bob" def my_func(self): print(self.value) class WithoutClass (): value = "Bob" def my_func(self): print(self.value) 

我主要担心的是,如果这会导致我在进一步的问题(目前我使用init调用),我将使用它的一种方式。

__init__之外的variables集属于类。 它们由所有实例共享。

__init__ (和所有其他方法函数)内创build的variables,并以self.开头self. 属于对象实例。

没有自我

创build一些对象:

 class foo(object): x = 'original class' c1, c2 = foo(), foo() 

我可以更改c1实例,并且不会影响c2实例:

 c1.x = 'changed instance' c2.x >>> 'original class' 

但是,如果我更改foo类,则该类的所有实例也将被更改:

 foo.x = 'changed class' c2.x >>> 'changed class' 

请注意Python的范围如何在这里工作:

 c1.x >>> 'changed instance' 

与自我

更改类不会影响实例:

 class foo(object): def __init__(self): self.x = 'original self' c1 = foo() foo.x = 'changed class' c1.x >>> 'original self' 

进一步对S.Lott的回答,类variables被传递给元类的方法,并且可以在元类定义时通过字典访问。 所以,即使在类被创build和实例化之前,也可以访问类variables。

例如:

 class meta(type): def __new__(cls,name,bases,dicto): # two chars missing in original of next line ... if dicto['class_var'] == 'A': print 'There' class proxyclass(object): class_var = 'A' __metaclass__ = meta ... ... 

我想添加一些东西,我在这个线程和这个线程 (它引用这一个)读取的响应。

免责声明 :这个评论来自我跑过的实验

__init__之外的variables

这些实际上是静态的类variables ,因此可以访问类的所有实例。

__init__variables

这些实例variables的值只对当前实例可访问(通过self引用)

我的贡献

程序员在使用静态类variables时必须考虑的一件事情是,它们可以被实例variables遮蔽(如果通过self引用访问静态类variables )。

说明

以前,我认为这两种声明variables的方式是完全相同的(愚蠢的我),这部分是因为我可以通过self引用来访问这两种variables。 现在,当我遇到麻烦的时候,我研究了这个话题,并把它解决了。

通过self引用访问静态类variables的问题在于,如果没有实例variables具有相同的名称,它只会引用静态类variables ,并且使事情变得更糟,试图通过self引用重新定义静态类variables因为一个实例variables被创build,然后阴影先前可访问的静态类variables

为了解决这个问题,你应该总是通过的名字引用静态的类variables

例如

 #!/usr/bin/env python class Foo: static_var = 'every instance has access' def __init__(self,name): self.instance_var = 'I am ' % name def printAll(self): print 'self.instance_var = %s' % self.instance_var print 'self.static_var = %s' % self.static_var print 'Foo.static_var = %s' % Foo.static_var f1 = Foo('f1') f1.printAll() f1.static_var = 'Shadowing static_var' f1.printAll() f2 = Foo('f2') f2.printAll() Foo.static_var = 'modified class' f1.printAll() f2.printAll() 

输出

 self.instance_var = I am f1 self.static_var = every instance has access Foo.static_var = every instance has access self.instance_var = I am f1 self.static_var = Shadowing static_var Foo.static_var = every instance has access self.instance_var = I am f2 self.static_var = every instance has access Foo.static_var = every instance has access self.instance_var = I am f1 self.static_var = Shadowing static_var Foo.static_var = modified class self.instance_var = I am f2 self.static_var = modified class Foo.static_var = modified class 

我希望这对某人有帮助

 class User(object): email = 'none' firstname = 'none' lastname = 'none' def __init__(self, email=None, firstname=None, lastname=None): self.email = email self.firstname = firstname self.lastname = lastname @classmethod def print_var(cls, obj): print ("obj.email obj.firstname obj.lastname") print(obj.email, obj.firstname, obj.lastname) print("cls.email cls.firstname cls.lastname") print(cls.email, cls.firstname, cls.lastname) u1 = User(email='abc@xyz', firstname='first', lastname='last') User.print_var(u1) 

在上面的代码中,User类有3个全局variables,每个variables的值都是“none”。 u1是通过实例化这个类创build的对象。 print_var方法打印出类User的类variables的值和对象u1的对象variables。 在下面显示的输出中,每个类variablesUser.emailUser.firstnameUser.lastname值为'none' ,而对象variablesu1.emailu1.firstnameu1.lastname值为'abc@xyz''first''last'

 obj.email obj.firstname obj.lastname ('abc@xyz', 'first', 'last') cls.email cls.firstname cls.lastname ('none', 'none', 'none')