Python中类的继承、多层继承和多继承
Python中,一个类可以通过继承的方式来获得父类中的非私有属性和非私有方法。
一、继承、重写、和调用重写的父类方法
继承的语法为在类名后的小括号()中写入要继承的父类名,如果要继承多个类则中间用逗号分隔。
class Electrical(object):
def __init__(self, name):
self.name = name
def watch_movie(self):
print('Watch movie!')
def game(self):
print('Play game!')
def chat(self):
print('Chat with friend!')
class Phone(Electrical, object):
def send_message(self):
print('Send message!')
def game(self):
print('Play game in phone!')
def chat(self):
super(Phone, self).chat()
print('Chat with anyone!')
p = Phone('VIVO')
# 继承父类的属性
print(p.name)
# 继承父类的方法
p.watch_movie()
# 子类自己实现的方法
p.send_message()
# 重写了父类的方法
p.game()
# 先继承父类的方法,在对父类方法的功能进行扩展
p.chat()
运行结果:
VIVO
Watch movie!
Send message!
Play game in phone!
Chat with friend!
Chat with anyone!
1.父类的非私有属性和非私有方法子类可以直接继承,子类对象可以直接使用。如果子类要调用父类的私有属性和私有方法,只能通过间接的方法来获取。
2.子类可以实现父类没有的属性和方法,与继承的属性和方法互不干扰。
3.如果在子类中有跟父类同名的方法,但方法中执行的内容不同,则子类可以重写父类方法。
当子类实现一个和父类同名的方法时,叫做重写父类方法。直接在子类中定义与父类同名的方法,然后在方法中实现子类的业务逻辑,子类方法就会覆盖父类的同名方法。子类重写了父类方法,子类再调用该方法将不会执行父类的方法。
4.如果在子类重写父类的方法中,需要使用父类同名方法中的功能,在父类功能基础上做扩展,则子类可以在重写的方法中调用父类被重写的方法,使用super()来调用。
二、类的多层继承
类可以多层继承。
class Mi(Phone):
pass
m = Mi('Redmi')
print(m.name)
m.chat()
运行结果:
Redmi
Chat with friend!
Chat with anyone!
继续上面的类,我们定义的类Mi继承自Phone类,Phone类继承自Electrical类,这样就构成了多层继承。
Mi类对象可以使用Phone中的方法和属性,也可以使用Electrical中的方法和属性,如果Phone重写了Electrical的方法,则继承的是Phone中的方法。
当Mi类对象调用属性和方法时,优先在自己的内部查找是否有该属性和方法,如果没有会到它的父类Phone中查找该属性和方法,如果没有会继续往上在Phone的父类Electrical中查找,一直查找到object类中。到最后也没有找到,就说明对象没有该属性和方法,程序报错,如果找到就会返回找到的属性和方法,不再继续往上查找。
三、类的多继承
class Computer(Electrical):
def coding(self):
print('Coding something!')
class HuaWei(Phone, Computer):
pass
h = HuaWei('huawei')
h.send_message()
h.coding()
print(h.name)
h.watch_movie()
运行结果:
Send message!
Coding something!
huawei
Watch movie!
同一个类可以继承多个类,如上面的HuaWei类同时继承了Phone和Computer两个类。这时,两个父类中的方法和属性子类都可以使用,两个父类的父类中的属性和方法子类也可以使用。