python面向对象三大特性(继承、多态、封装)之继承
来吧,下面来具体说一下面向对象的三大特性:所谓封装、多态和继承。我们先来说一下继承。
所谓继承,顾名思义,子类继承父类的属性,包括数据属性和函数属性。写个简单的例子吧:
1.简单的继承
class Animal:
need_substance = 'water'
def __init__(self):
print('这是一个动物类')
def eat(self):
print('动物都需要吃东西')
class Dog(Animal):
def __init__(self,name,age):
self.name=name
self.age=age
d1 = Dog('小黑',5) #实例化一个对象:小黑
print(d1.need_substance) #输出结果:water
d1.eat() #输出结果:动物都需要吃东西
2.重写父类方法
上面是一个简单的继承的例子,下面看一个关于重写父类方法的例子:
class Animal:
need_substance = 'water'
def __init__(self):
print('这是一个动物类')
def eat(self):
print('动物都需要吃东西')
class Dog(Animal):
def __init__(self,name,age):
self.name=name
self.age=age
def eat(self,food): #重写父类的eat方法,但是并没有影响父类的eat方法,只是对象在调用的时候优先调用自己的方法,这是一个作用域的问题。
print('%s喜欢吃%s' %(self.name,food))
d1 = Dog('小黑',5)
d1.eat('肉')
3、类方法
类方法,顾名思义就是专门用类名直接调用的方法,不需要实例化一个对象就可以直接使用。当然了,实例化一个对象后也可以调用。
直接上代码,仔细体会其中的思想。
class Animal:
need_substance = 'water'
@classmethod
def sum(cls,x,y):
return x+y
class Dog(Animal):
def __init__(self,name):
self.name=name
print(Animal.sum(2,3))
print(Animal.need_substance)
print('-----------------')
a = Animal()
print(a.sum(2,3))
print(a.need_substance)
print('-----------------')
d = Dog('小黑')
print(d.sum(2,3))
print(d.name)
print(d.need_substance)
输出结果:
D:\python\python.exe D:/python/project/file_exec.py
5
water
-----------------
5
water
-----------------
5
小黑
water
Process finished with exit code 0
4、静态方法
直接上代码:
class Animal:
need_substance = 'water'
@classmethod
def sum(cls,x,y):
return x+y
@staticmethod
def eat():
print('动物都需要吃东西')
class Dog(Animal):
def __init__(self,name):
self.name=name
Animal.eat()
print('---------------')
a = Animal()
a.eat()
print('---------------')
d = Dog('小黑')
d.eat()
输出结果:
D:\python\python.exe D:/python/project/file_exec.py
动物都需要吃东西
---------------
动物都需要吃东西
---------------
动物都需要吃东西
Process finished with exit code 0
5、真正的继承 --这才是大招,归一化设计
其实上面这些都谈不上真正的继承,真正的继承应该是有一个父类,比如父类有两个方法,那么严格限定子类也必须有这两个方法。
来个代码示例:
import abc
#定义一个基类
class Cat(metaclass=abc.ABCMeta):
need_substance = 'water'
@abc.abstractmethod
def eat(self):
print('猫都喜欢吃鱼')
@abc.abstractmethod
def catch_mice(self):
print('猫都擅长抓老鼠')
#定义一个加菲猫
class Garfield(Cat):
pass
g = Garfield()
输出结果:
D:\python\python.exe D:/python/project/file_exec.py
Traceback (most recent call last):
File "D:/python/project/file_exec.py", line 16, in <module>
g = Garfield()
TypeError: Can't instantiate abstract class Garfield with abstract methods catch_mice, eat
Process finished with exit code 1
呦呵,报错了。上面的报错什么意思呀?看TypeError后面的内容,提示缺少catch_mice, eat这两个方法。
来吧,下面改写下上面这段代码:
import abc
#定义一个基类
class Cat(metaclass=abc.ABCMeta):
need_substance = 'water'
@abc.abstractmethod
def eat(self):
print('猫都喜欢吃鱼')
@abc.abstractmethod
def catch_mice(self):
print('猫都擅长抓老鼠')
#定义一个加菲猫
class Garfield(Cat):
def __init__(self,name):
self.name=name
def eat(self):
print('%s除了喜欢吃鱼,还喜欢吃老鼠' %self.name)
def catch_mice(self):
super().catch_mice()
g = Garfield('加菲猫')
g.eat()
g.catch_mice()
输出结果:
D:\python\python.exe D:/python/project/file_exec.py
加菲猫除了喜欢吃鱼,还喜欢吃老鼠
猫都擅长抓老鼠
Process finished with exit code 0