0

Can someone tell me what is the different between default_age and self.default_age?
Only one default_age variable is created for all instance of class Student and self.default_age means very instances of class Student gets a variable default_age?

How do you specify a static class(singleton class) in python?

class Student: 
   default_age = 20               # base class variable 
   def __init__(self, age): 
               self.default_age = age
2
Contributors
3
Replies
6
Views
10 Years
Discussion Span
Last Post by BearofNH
0

Only one default_age variable is created for all instance of class Student and self.default_age means every instances of class Student gets a variable default_age?

No. In your example you've defined variable Student.default_age which has nothing to do with any default_age property that a class instance may have. The class instance default_age property gets created on the fly when it is applied to a class instance. This is true of all properties, and does not need to happen "inside" the class definition code.

I don't think there's any language primitive that allows you to create static classes in Python. You can achieve the same effect by redefining the __init__() constructor along the lines of:

class once:
    def __init__(self, data):
        self.data = data
        once.__init__ = once.__nomore__ # Redefine away the __init__ constructor
        return
    def __nomore__(self, ignored):
        print "No further entries can be created"
        return

my_once  = once("Never again")  # Works
my_twice = once("Let's re-try") # Prints No further entries can be created

If you want to be even more explicit, just set once.__init__ = None , which will cause a TypeError exception if anybody tries to make another once.

0

Can someone explain to me what is going on here? In this example "a" and "self.a" both same? t, t2 are instance of Truc and when I do:

>>>Truc.gotcha()
>>> print Truc.a
1

Why doesn't Truc.gotcha() incerment it by 1, so "print Truc.a" would be "2", not "1"?

>>> class Truc:
...     a=1
...     def gotcha(self):
...         self.a +=1
...         print self.a
... 
>>> print Truc.a
1
>>> t=Truc()
>>> print t.a
1
>>> t.gotcha()
2
>>> print Truc.a
1
>>> t2=Truc()
>>> print t2.a
1
>>> t2.gotcha()
2
>>> print Truc.a
1
>>> t.gotcha()
3
>>> print t.a
3
>>> print t2.a
2
>>> print Truc.a
1
>>>Truc.gotcha() 
>>> print Truc.a
1
0

You probably need to read up on Python namespaces. When you say t=Truc() you define a class instance t that has its own namespace. When you first request the value of t.a Python sees there is no attribute a of t, and looks in outer namespaces, finding the class variable Truc.a and returns that value. But if you later say t.a=101 you create a new attribute t.a that has no relationship to Truc.a. Subsequent requests for the value t.a find a in t's namespace and return that value.

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.