A question about Python Classes
Steven D'Aprano
steve+comp.lang.python at pearwood.info
Sat Apr 23 20:03:17 EDT 2011
On Sat, 23 Apr 2011 13:30:02 -0700, chad wrote:
> On Apr 22, 12:47 pm, Carl Banks <pavlovevide... at gmail.com> wrote:
>> On Thursday, April 21, 2011 11:00:08 AM UTC-7, MRAB wrote:
>> > On 21/04/2011 18:12, Pascal J. Bourguignon wrote:
>> > > chad<cda... at gmail.com> writes:
>>
>> > >> Let's say I have the following....
>>
>> > >> class BaseHandler:
>> > >> def foo(self):
>> > >> print "Hello"
>>
>> > >> class HomeHandler(BaseHandler):
>> > >> pass
>>
>> > >> Then I do the following...
>>
>> > >> test = HomeHandler()
>> > >> test.foo()
>>
>> > >> How can HomeHandler call foo() when I never created an instance of
>> > >> BaseHandler?
>>
>> > > But you created one!
>>
>> > No, he didn't, he created an instance of HomeHandler.
>>
>> > > test is an instance of HomeHandler, which is a subclass of
>> > > BaseHandler, so test is also an instance of BaseHandler.
>>
>> > test isn't really an instance of BaseHandler, it's an instance of
>> > HomeHandler, which is a subclass of BaseHandler.
>>
>> I'm going to vote that this is incorrect usage. An instance of
>> HomeHandler is also an instance of BaseHandler, and it is incorrect to
>> say it is not. The call to HomeHandler does create an instance of
>> BaseHandler.
>>
>>
> What do you mean by the "call to HomeHandler"? Don't I call HomeHandler
> after I create an instance of BaseHandler?
Not directly/explicitly.
The process you do is:
(1) Create the class BaseHandler.
(2) Create the class HomeHandler, which is a subclass of BaseHandler.
(3) Call HomeHandler.
At no point do you create a *direct* instance of BaseHandler (e.g. by
calling BaseHandler). However the instance of HomeHandler is ALSO an
instance of BaseHandler by virtue of the is-subclass relationship:
>>> issubclass(HomeHandler, BaseHandler)
True
>>> isinstance(test, HomeHandler)
True
>>> isinstance(test, BaseHandler)
True
If you *had* created a direct instance of BaseHandler by calling
BaseHandler:
>>> base = BaseHandler()
>>> isinstance(base, BaseHandler)
True
>>> isinstance(base, HomeHandler):
False
It's like this... "Toyota Prius" is a subclass of "Motor Vehicle", so
each and every Prius car is also a motor vehicle. But not every motor
vehicle is a Toyota Prius.
--
Steven
More information about the Python-list
mailing list