> On Feb 23, 2017, at 4:40 PM, MRAB <pyt...@mrabarnett.plus.com> wrote:
> 
> On 2017-02-24 00:19, Irv Kalb wrote:
>> Hi,
>> 
>> I have built a set of three classes:
>> 
>> -  A super class, let's call it: Base
>> 
>> -  A class that inherits from Base, let's call that: ClassA
>> 
>> -  Another class that inherits from Base, let's call that: ClassB
>> 
>> ClassA and ClassB have some code in their __init__ methods that set some 
>> instance variables to different values.  After doing so, they call the the 
>> __init__ method of their common super class (Base) to set some other 
>> instance variables to some common values.  This all works great.  Instances 
>> of ClassA and ClassB do just what I want them to.
>> 
>> I would like to add is some "insurance" that I (or someone else who uses my 
>> code) never instantiates my Base class,  It is not intended to be 
>> instantiated because some of the needed instance variables are only created 
>> in the __init__ method of ClassA and ClassB.  I am looking for some way in 
>> the Base's __init__ method to determine if the method was called directly:
>> 
>>    instanceOfBase = Base(... some data ...)  # I want this case to generate 
>> an error
>> 
>> I tried using "isinstance(self, Base)", but it returns True when I 
>> instantiate an object from ClassA, from ClassB, or from Base.
>> 
>> If I can find a way to determine that the caller is attempting to 
>> instantiate Base directly, I will raise an exception.
>> 
>> Thanks,
>> 
>> Irv
>> 
>> (If it makes a difference, I am doing this currently in Python 2.7 - please 
>> don't beat me up about that.)
>> 
> Apart from renaming Base to _Base as a hint, you could put Base's 
> initialisation code in, say, '_init' and have Base's __init__ just raise an 
> exception.
> 
> ClassA and ClassB would then call Base's _init instead of its __init__.
> 
> -- 
> https://mail.python.org/mailman/listinfo/python-list
> 

MRAB and Peter:  Thank you very much for your solutions.  I had considered both 
of these, but was wondering if there was another way.   Peter's solution does 
exactly what I want, but I'm not ready to get into metaclasses.  So I decided 
to go with MRAB's approach.  I've modified my code and it seems to work great.

Thank you both.

Irv

-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to