On 12/9/2013 02:15, chandan kumar wrote: > Hi , > > I'm new to python
Welcome. I hope you enjoy your time here, and that the language treats you as well as it's treated me. > ,please correct me if there is any thing wrong with the way accessing class attributes. None of the following uses class attributes, but instead uses instance attributes. For example, any attri bute created with self.xxxx = inside an instance method will bei an instance attribute. Class attributes are typically created by assignments outside any method. > > Please see the below code .I have inherited confid in ExpectId class, changed > self.print_msg to Hello. Now inherited confid in TestprintmsgID class.Now > I wanted to print self.print_msg value (which is changed under ExpectId > class) as Hello under TestprintmsgID. I end up with error saying > TestprintmsgID has no attribute self.print_msg. Atleast i expect the null to > be printed. Please include the full error message, (including the traceback), rather than just paraphrasing. In this case, it's easy to guess, but frequently it is not. > > > > class confid(): In Python 2, you always want to derive from object. That's to signal the compiler to use "new style" classes, which have been the preferred way for many years. Python 3 only has new-style classes. class confid(object): > def __init__(self): > self.print_msg = "" > > class ExpectId(confid): > > def __init__(self): > self.print_msg = " Hello" > > def expectmethod(self): > print "self.print_mesg = ",self.print_msg > Each instance of ExpectId is also an instance of confid. > class TestprintmsgID(confid): > > def __init__(self): > "Created Instance" > > def printmsgmethod(self): > print "printmsgmethod print_msg val = ",self.print_msg---- Here is > the Attribute error > > Each instance of TestprintmsgID is also an instance of confid, but NOT of ExpectID. The base class methods are not automatically called when the child class methods are. if you want them called, you have to do it explicitly. In particular, you should always call the base class __init__() method from your __init__() method. It didn't happen to matter in the case of ExpectID, but it does here. Preferred way to do that is to add a line to iTextprintmsgID's __init__() method: super(ExpectId, self).__init__() should appear at the beginning of your initializer. This will eliminate your Attribute error. But it will still see a value for print_msg of bank string. > if __name__ == '__main__': > ins1 =ExpectId() > ins1.expectmethod() > > ins2 = TestprintmsgID() > ins2.printmsgmethod() > I think you're expecting that deriving from a class somehow patches the existing class. But it doesn't. The existence of the ExpectedID class only affects instances of that class, not instances of TestprintmsgID. If you wanted those to be affected, you'd be needing to inherit from ExpectID, rather than just from confid. If you did that, you'd see a value of "Hello". -- DaveA -- https://mail.python.org/mailman/listinfo/python-list