python继承、多态和实例化

 

首先是定义父类:

Animal类

  1. 首先定义一个Animal的父类,父类没有继承的类时,写object
  2. 在父类里面首先是def__init__(self,name,age) 这是一个初始化父类变量的函数,即,变量初始化函数
  3. 在父类里面定义了一个函数who() 这个who函数不需要传递参数
  4. 在父类里面定义了一个eat函数,需要传递food的参数,这里需要注意由于这个food在def__init__(self,name,age)没有对其初始化,所以在print一行不能使用self.food,否则会报错为 “AttributeError: 'Dog' object has no attribute 'food'”
class Animal(object):#父类

    def __init__(self,name,age):#对象建立时马上对此对象初始化
        self.name=name
        self.age=age
        print('Animal is %s' % self.name)#注意格式
    
    def who(self):#又一个方法
        print('name: "%s"  age:%s' % (self.name,self.age))#格式
        
    def eat(self,food):
#        print("%s is eating %s"%(self.name,self.food))
        print("%s is eating %s"%(self.name,food))

Relation 类

  1. 这个类没有变量初始化函数,
  2. 只定义了一个make_friend的函数,注意:跟上面的eat函数一样,这里在print的时候,也只能写obj,而不是self.obj
class Relation(object):
    
    def make_friend(self,obj):
        print("%s is making friends with %s"%(self.name,obj))
 

其次是定义子类,在子类里调用父类

Dog类:

  1. 子类Dog继承了两个父类:Animal和Relation,如果它们都有构造函数,在继承顺序上就会先继承Animal的init构造函数
  2. 由于子类Dog新增了一个变量height,所以在初始化变量的时候,先定义属于自己的初始化函数,再引入原来父类的方法Animal.__init__(self,name,age) ,最后初始化只属于自己的新的变量height:self.height=height
  3. 重写了父类的eat函数,里面具体是,先调用父类的eat方法,然后再添加自己的内容,即print部分
  4. 另外,由于这里没有体现Relation,也就是说,Dog已经继承了Relation的make_fiend函数。
class Dog(Animal,Relation):#子类引用
    
    def __init__(self,name,age,height):#自己的方法添加额外元素
        Animal.__init__(self,name,age)#此方法里要加入父类方法的引用,很关键的一步
        self.height=height#添加具体内容
    def eat(self,food):
        Animal.eat(self,food)
        print("The dog eat too little,and its height is:%d"% self.height)

实例化,以及运行结果是:

dog = Dog('dog',10,100)
dog.who()  
dog.eat('meat')              
dog.make_friend('meat')


'''

下面是运行结果

'''

Animal is dog
name: "dog"  age:10
dog is eating meat
The dog eat too little,and its height is:100
dog is making friends with meat

Cat类:

  1. 与Dog类不同的是,Cat类使用的不同的调用父类的方式
  2. Cat只继承了Animal父类
  3. 由于子类Cat新增了一个变量price,所以在初始化变量的时候,先定义属于自己的初始化函数def __init__(self,name,age,price),再引入原来父类的方法super(Cat,self).__init__(name,age) ,最后初始化只属于自己的新的变量price:self.price = price
  4. 另外,由于父类没有run的方法,所以run的方法是Cat类独有的,在下面定会定义了run()
  5. 父类的who()和eat()方法,继承了父类,没有改变
class Cat(Animal):
    
    def __init__(self,name,age,price):
        super(Cat,self).__init__(name,age)
        self.price = price
        
    def run(self):
        print("%s's price is:%d can run " % (self.name,self.price))

实例化如下:

cat = Cat('cat',20,7) 
cat.run()
cat.who()
cat.eat('meat')


'''
运行结果
'''

Animal is cat
cat's price is:7 can run 
name: "cat"  age:20
cat is eating meat

Bird类:

  • 这个类是一个特例,它的初始化函数def __init__(self,age)这样写,直接就会覆盖父类的所有构造函数
  • 还有这个def eat(self) 方法,直接就将父类方法替换了
class Bird(Animal):
    
    def __init__(self,age):
        self.age = age
        print("age is %d"% self.age)
        
    def eat(self):
        print("%d years old bird can eat grass"% self.age)

实例化和运行结果如下

bird = Bird(10)
bird.eat()

'''

结果如下

'''

age is 10
10 years old bird can eat grass

更新于2020.6.25

1 上面animal是父类,cat、dog、和bird都是子类,父类中的show函数被子类重写,体现了类的多态,同样的方法,不同子类调用出来的呈现结果不一样;

但是可以看出来 ,name函数由于没有被重写,所有每个子类调用出来的结果是一样的。

2 另,需要了解的是列表扩展式的使用方法,item和item()的使用方法

item依次相当于是animal,cat,dog,和bird,item()相当于是依次对这几个类实例化,所以X列表就是四个类实例化的对象。

因此,下面就可以用点方法名去调用。

子类的方法调用父类方法的方式有两种:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值