class instance customization

Steven D'Aprano steve at REMOVE-THIS-cybersource.com.au
Sun Apr 18 11:23:56 CEST 2010


On Sat, 17 Apr 2010 19:55:44 +0400, Alexander wrote:
 
> Ok, I'll try to explain on the following example. Let's consider class
> MyClass that holds one string and concatenate it with other not defined
> in this class:
[...]
> and with working application:
> 
> a = MyClass()
> a.set('key1')
> 
> b1 = a.new('value1')
> b2 = a.new('value2')
> 
> print b1, "," ,b2 # give 'key1 value1 , key1 value2'
> 
> a.set('key2')
> 
> print b1, ",", b2 # give 'key2 value1 , key2 value2'

Looking at your design, I can't see any reason for SubClass to be a 
subclass of MyClass. It doesn't inherit any behaviour, and the 
constructor takes completely different arguments. Why make it a Subclass?

MyClass is dangerous: creating an instance doesn't fully initialise the 
instance, it leaves it in a half-initialised state that can cause 
exceptions from simple operations like:

instance = MyClass()
print instance

This is very bad design.

Redesigning the pair of classes, I get this:

class MyClass(object):
    def __init__(self, key):
        self.key = key  # No obvious need to make key a private attribute.
    def new(self, value):
        return AnotherClass(self, value)

class AnotherClass(object):
    def __init__(self, obj, value):
        self.obj = obj
        self.value = value
    def __str__(self):
        return "%s %s" % (self.obj.key, self.value)


which gives the behaviour you ask for:

>>> a = MyClass('key1')
>>> b1 = a.new('value1')
>>> b2 = a.new('value2')
>>> print b1, "," ,b2
key1 value1 , key1 value2
>>>
>>> a.key = 'key2'
>>> print b1, "," ,b2
key2 value1 , key2 value2



-- 
Steven



More information about the Python-list mailing list