类__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.email
, User.firstname
和User.lastname
值为'none'
,而对象variablesu1.email
, u1.firstname
和u1.lastname
值为'abc@xyz'
, 'first'
和'last'
。
obj.email obj.firstname obj.lastname ('abc@xyz', 'first', 'last') cls.email cls.firstname cls.lastname ('none', 'none', 'none')