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
posted @ 2024-07-22 17:15  疯狂Python  阅读(1)  评论(0编辑  收藏  举报