"object" vs "dynamic" programming styles
Edward C. Jones
edcjones at erols.com
Sat Mar 24 16:28:30 EST 2001
Here are three methods for doing the same thing. When is it better to use
one of the approaches rather than another?
=============================================================
# Program 1:
# The constructor X(c) actually creates an A or B instance.
class X:
def __init__(self, c):
self.whoami = 'X'
self.Xs = 'Xs'
if c == 'a':
self.__class__ = A
A.__init__(self)
elif c == 'b':
self.__class__ = B
B.__init__(self)
def fun(self):
print 'X.fun called'
class A(X):
def __init__(self):
X.__init__(self, '')
self.whoami = 'A'
self.As = 'As'
def fun(self):
print 'A.fun called'
class B(X):
def __init__(self):
X.__init__(self, '')
self.whoami = 'B'
self.Bs = 'Bs'
a = X('a')
print 'a.__class__:', a.__class__
print 'a.whoami:', a.whoami
print 'a.Xs:', a.Xs
print 'a.As:', a.As
a.fun()
b = X('b')
b.fun()
===================================================================
# Program 2
# Which attributes X(c) has depends on the value of c.
class X:
def __init__(self, c):
self.Xs = 'Xs'
if c == 'a':
self.set_A()
elif c == 'b':
self.set_B()
def set_A(self):
self.whoami = 'A'
self.As = 'As'
self.fun = self.fun_A
def set_B(self):
self.whoami = 'B'
self.Bs = 'Bs'
def fun_A(self):
print 'A_fun'
a = X('a')
print 'a.__class__:', a.__class__
print 'a.whoami:', a.whoami
print 'a.Xs:', a.Xs
print 'a.As:', a.As
a.fun()
b = X('b')
try:
b.fun()
except AttributeError, x:
print x
===================================================================
# Program 3
# The function New_X returns an instance of either class A or class B.
def New_X(c):
if c == 'a':
return A()
if c == 'b':
return B()
class A:
def __init__(self):
self.whoami = 'A'
self.Xs = 'Xs'
self.As = 'As'
def fun(self):
print 'A.fun called'
class B:
def __init__(self):
self.whoami = 'B'
self.Xs = 'Xs'
self.Bs = 'Bs'
a = New_X('a')
print 'a.__class__:', a.__class__
print 'a.whoami:', a.whoami
print 'a.Xs:', a.Xs
print 'a.As:', a.As
a.fun()
b = New_X('b')
try:
b.fun()
except AttributeError, x:
print x
===================================================================
More information about the Python-list
mailing list