Created
August 6, 2010 16:24
-
-
Save thenigan/511569 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class ExampleClass: | |
classVar = "classVar" | |
def __init__(self): | |
self.instanceVar = "instanceVar" | |
class BorgClass: | |
__shared_state = {} | |
classVar = "classVar" | |
def __init__(self): | |
self.__dict__ = self.__shared_state | |
self.instanceVar = "instanceVar" | |
print "Assume this class:\n" | |
print "class ExampleClass:" | |
print " classVar = 'classVar'" | |
print " def __init__(self):" | |
print " self.instanceVar = 'instanceVar'\n" | |
print "(1) classVars can be printed before an instance of the class exists:\n" | |
print ">>> ExampleClass.classVar" | |
print ExampleClass.classVar, "\n" | |
print "(2) instanceVars can only be printed once an instance exists:\n" | |
print ">>> ExampleClass.instanceVar" | |
print "Traceback (most recent call last):" | |
print " File '<stdin>', line 1, in <module>" | |
print "AttributeError: class ExampleClass has no attribute 'instanceVar'\n" | |
print "(3) Setting a class variable from an instance of the class doesn't quite do what we'd expect:\n" | |
print ">>> a = ExampleClass()" | |
a = ExampleClass() | |
print ">>> b = ExampleClass()" | |
b = ExampleClass() | |
print ">>> a.classVar = 'fizzbuzz'" | |
a.classVar = "fizzbuzz" | |
print ">>> print a.classVar" | |
print a.classVar | |
print ">>> print b.classVar" | |
print b.classVar, "\n" | |
print "(3b) We can achieve a unified class variable by adding the __class__ reference:\n" | |
print ">>> c = ExampleClass()" | |
c = ExampleClass() | |
print ">>> d = ExampleClass()" | |
d = ExampleClass() | |
print ">>> c.__class__.classVar = 'fizzbuzz'" | |
c.__class__.classVar = "fizzbuzz" | |
print ">>> print c.classVar" | |
print c.classVar | |
print ">>> print d.classVar" | |
print d.classVar, "\n" | |
#*******************************************************88 | |
class BorgClass: | |
__shared_state = {} # empty dict | |
classVar = "classVar" # class variable | |
def __init__(self): | |
self.__dict__ = self.__shared_state | |
self.instanceVar = "instanceVar" | |
print "Now assume this 'Borg' class:\n" | |
print "class BorgClass:" | |
print " __shared_state = {} # empty dict" | |
print " classVar = 'classVar' # class variable\n" | |
print " def __init__(self):" | |
print " self.__dict__ = self.__shared_state # bind individual dicts to class variable dict" | |
print " self.instanceVar = 'instanceVar' # instance var\n" | |
print "(4) the Borg nature of this class means that class vars will change 'as one':\n" | |
print ">>> e = BorgClass()" | |
e = BorgClass() | |
print ">>> f = BorgClass()" | |
f = BorgClass() | |
print ">>> e.classVar = 'fizzbuzz'" | |
e.classVar = "fizzbuzz" | |
print ">>> print e.classVar" | |
print e.classVar | |
print ">>> print f.classVar" | |
print f.classVar, "\n" | |
print "(5) even instance variables move 'as one' in a Borg class:\n" | |
print ">>> print e.instanceVar" | |
print e.instanceVar | |
print ">>> print f.instanceVar" | |
print f.instanceVar | |
print ">>> e.instanceVar = 'modified text'" | |
e.instanceVar = "modified text" | |
print ">>> print e.instanceVar" | |
print e.instanceVar | |
print ">>> print f.instanceVar" | |
print f.instanceVar |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment