首先是定义父类:
Animal类
- 首先定义一个Animal的父类,父类没有继承的类时,写object
- 在父类里面首先是def__init__(self,name,age) 这是一个初始化父类变量的函数,即,变量初始化函数
- 在父类里面定义了一个函数who() 这个who函数不需要传递参数
- 在父类里面定义了一个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 类
- 这个类没有变量初始化函数,
- 只定义了一个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类:
- 子类Dog继承了两个父类:Animal和Relation,如果它们都有构造函数,在继承顺序上就会先继承Animal的init构造函数
- 由于子类Dog新增了一个变量height,所以在初始化变量的时候,先定义属于自己的初始化函数,再引入原来父类的方法Animal.__init__(self,name,age) ,最后初始化只属于自己的新的变量height:self.height=height
- 重写了父类的eat函数,里面具体是,先调用父类的eat方法,然后再添加自己的内容,即print部分
- 另外,由于这里没有体现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类:
- 与Dog类不同的是,Cat类使用的不同的调用父类的方式
- Cat只继承了Animal父类
- 由于子类Cat新增了一个变量price,所以在初始化变量的时候,先定义属于自己的初始化函数def __init__(self,name,age,price),再引入原来父类的方法super(Cat,self).__init__(name,age) ,最后初始化只属于自己的新的变量price:self.price = price
- 另外,由于父类没有run的方法,所以run的方法是Cat类独有的,在下面定会定义了run()
- 父类的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列表就是四个类实例化的对象。
因此,下面就可以用点方法名去调用。