Inheritance
Single inheritance
# Vehicle.h
class Vehicle(object):
    """Document String: Define a Vehicle class"""
 
    def __init__(self, brand, year):
        self._brand = brand;
	self._year = year;
 
    @property
    def brand(self):
        return self._brand
 
    @brand.setter
    def brand(self, b):
        self._brand = b;
 
    @brand.deleter
    def brand(self):
        del self._brand
 
    @property
    def year(self):
        return self._year
 
    @year.setter
    def year(self, y):
        self._year = y
 
    @year.deleter
    def year(self):
        del self._year
 
    def __str__(self):
        return self._brand+' '+str(self._year)
 
    def __getattr__(self, attr): # intercept that inexistent attribute
        return '~'
		
# Car.py
from Vehicle import Vehicle;

class Car(Vehicle):
	"""Define class Car, which is inherit from class Vehicle"""
	def __init__(self, brand, year, model):
	    """Construct"""
	    print "Create Car Object ..."; 
	    super(Car, self).__init__(brand, year);
	    #Vehicle.__init__(self, brand, year);
	    self.__model = model;

        @property
        def model(self):
            return self.__model

        @model.setter
        def model(self, value):
            self.__model = value

        @model.deleter
        def model(self):
            del self.__model

        # override __str__ in Vehicle
	def __str__(self):
            #return super(Car, self).__str__() + " " + self.model
            return Vehicle.__str__(self) + " " + self.model

def main():
	v = Vehicle("Buick", 1998)
        print(v)

	c = Car("Lincoln", 1998, "Continental");
        print(c)

        print(issubclass(Car, Vehicle)) # True
        print(isinstance(c, Car)) # True

if __name__ == '__main__':
	main();

		
Abstract class
class Vehicle(object):
    """Abstract base class Vehicle"""
 
    def __init__(self, brand, year):
        if self.__class__ == Vehicle:
            raise NotImplementedError('Cannot create Vehicle instance ...')

        self._brand = brand;
	self._year = year;
 
    @property
    def brand(self):
        return self._brand
 
    @brand.setter
    def brand(self, b):
        self._brand = b;
 
    @brand.deleter
    def brand(self):
        del self._brand
 
    @property
    def year(self):
        return self._year
 
    @year.setter
    def year(self, y):
        self._year = y
 
    @year.deleter
    def year(self):
        del self._year
 
    def __str__(self):
        return self._brand+' '+str(self._year)
 
    def __getattr__(self, attr): # intercept that inexistent attribute
        return '~'
		
from Vehicle import Vehicle;

class Car(Vehicle):
	"""Define class Car, which is inherit from class Vehicle"""
	def __init__(self, brand, year, model):
	    """Construct"""
	    print "Create Car Object ..."; 
	    super(Car, self).__init__(brand, year);
	    #Vehicle.__init__(self, brand, year);
	    self.__model = model;

        @property
        def model(self):
            return self.__model

        @model.setter
        def model(self, value):
            self.__model = value

        @model.deleter
        def model(self):
            del self.__model

        # override __str__ in Vehicle
	def __str__(self):
            #return super(Car, self).__str__() + " " + self.model
            return Vehicle.__str__(self) + " " + self.model

def main():
        try:
            v = Vehicle("Buick", 1998) # Vehicle is an abstract class, can not be used to create instance
        except Exception, err:
            print(err)

	c = Car("Lincoln", 1998, "Continental");
        print(c)

if __name__ == '__main__':
	main();