<< Chapter < Page | Chapter >> Page > |
Figure 6 . Output from the code in Listing 10. |
---|
6 Modify class var using class
7 Display class var using objectsTestClass object at 0x02091DD0: [1, 2, 3, 4, 'a', True]
TestClass object at 0x0218C710: [1, 2, 3, 4, 'a', True]8 Display class var using class: [1, 2, 3, 4, 'a', True] |
Both objects see the change that was made to the list even though that change was made independently of either object.
This sort of behavior can lead to programming errors that are very easy to make and very difficult to find and fix. In my opinion, you should usemutable class variables very rarely if at all. On the other hand, class variables that are not mutable, such as tuples, can be very useful and are muchsafer to use. Even in that case, however, one immutable object can be replaced by a different immutable object so even the use of immutable objects is nottotally safe.
If an instance variable belonging to an object has the same name as a class variable in the class from which the object was instantiated, the instancevariable will "shadow" or hide the class variable insofar as that object is concerned. This is illustrated by the program shown in Listing 17 . The output from the program is shown in Figure 12 .
The class definition in Listing 11 contains a class variable named classVar . The class definition also contains a method named shadowClassVariable . If that method is executed on an object instantiated from the class, it will add a new instance variable to the objectnamed classVar . From that point forward, the class variable named classVar won't be visible insofar as that object is concerned unless it accesses the class variable using the name of the class, TestClass .
Listing 11 . Class definition with a shadowing method. |
---|
class TestClass(object):
classVar = 1234#Note, the following code adds a new instance variable named classVar
# to the object, which "shadows" or hides the actual class variable# named classVar insofar as this object is concerned.
def shadowClassVariable(self):self.classVar = "ABCD"
def printClassVar(self):print(str(self)[10:40] + ": " + str(self.classVar)) |
Listing 11 also defines a method named printClassVar . This method concatenates and prints a portion of the object identifier (self) with the contents of classVar (as seen by the object) .
The code in Listing 12 instantiates two different objects from the class named TestClass and saves the objects' references in the variables named ref01 and ref02 .
Listing 12 . Instantiate and display classVar in two objects. |
---|
print("1 Instantiate two objects")
ref01 = TestClass()ref02 = TestClass()
print("2 Display classVar using objects")ref01.printClassVar()
ref02.printClassVar() |
The code in Listing 12 also uses those references to call the method named printClassVar on each object. This causes the contents of classVar to be printed as seen by each object at this point in the program. The results are shown in Figure 7 .
Notification Switch
Would you like to follow the 'Itse 1359 introduction to scripting languages: python' conversation and receive update notifications?