[Tutor] Object/Class Beginner Questions
Steven D'Aprano
steve at pearwood.info
Fri Jan 14 22:39:06 CET 2011
Ben Ganzfried wrote:
> Hey guys,
>
> I'm using a tutorial geared for a 2.x version of Python and I am currently
> using Python 3.1-- so it is possible that my confusion has to do with
> different notations between them. But in any case, here is what I have:
> My questions are the following:
> 1) Why is the type for my class Time : >>> type(Time)
> <class 'type'>
> when the type for their class Point is: <type 'classobj'>
In Python 2.x, objects are divided into two broad families of objects:
1. "classic classes" and their instances;
2. "new-style" types and their instances (including built-ins like str,
int, float, and similar).
There are some small, but significant differences between them, but in
general they do mostly the same kind of things.
In Python 2.x, a class definition like:
class Point:
...
defines a classic class (or "old style class"), while inheriting from
"object" or a built-in type defines a new-style class:
class Point(object): # Tells Python to construct a new-style class
...
The type of an instance is the instance's class; the type of a class
object is "classobj" for old-style classes and (usually) "type" for
new-style classes and types. Calling type() on old-style classes returns
<classobj>, and on new-style, <type>.
But in Python 3, old-style classic classes are gone. Point will be a
"type" object, which is what you are seeing.
> Also, what is the difference between "class" and "classobj" in this case?
Every object has a type, even classes. `class` is the keyword that you
use for creating new classes, and type() is what you use to find out
what they are. So:
type(42) -> int # 42 is an int
type(int) -> type # int is a new-style class, or "type"
In Python 2.x, the type of a classic class is called "classobj", and the
type of a new-style class is called "type".
> 2) Why does my t1 object give the following as its type: <class
> '__main__.Time'>
> And in their p object example the type is: <type 'instance'>?
Again, this boils down to old-style vs. new-style.
> 3) What is happening such that when I try to call my print_time(t1) function
> I get the following error:
>>>> t1 = Time()
>>>> t1.hours = 3
>>>> t1.minutes = 30
>>>> t1.seconds = 45
>>>> print_time(t1)
> Traceback (most recent call last):
> File "<pyshell#77>", line 1, in <module>
> print_time(t1)
> NameError: name 'print_time' is not defined
You don't have a print_time function, as Python correctly reports. You
have a print_time *method*, which means it lives inside Time objects.
You can't access it directly as a global function:
print_time(something)
does not work, because print_time doesn't live in the global namespace.
You need to call it as a method of a Time instance:
t1.print_time() # no additional arguments needed
--
Steven
More information about the Tutor
mailing list