Python全栈开发教程——026

面向对象编程:继承、方法重写与多态
文章讲述了面向对象编程中的继承、方法重写和多态概念。继承允许子类复用父类的属性和方法,方法重写使子类能根据需要定制父类的方法。Python的object类是所有类的基类,可通过重写str方法展示对象的属性。多态则允许不关心对象的具体类型,只关注其行为,动态语言如Python实现多态更灵活,依赖鸭子类型。
  • 方法重写

继承是一种常见的代码复用技术,是面向对象编程中的重要概念之一。通过继承,子类可以继承父类的属性和方法,从而减少代码的冗余,提高代码的可维护性和可扩展性。
在继承中,方法的重写是一种非常重要的概念。所谓方法重写,就是在子类中对父类中的方法进行重新编写,以满足子类的特殊需求。当父类中的方法不能完全满足子类的需求时,子类就需要对该方法进行重写。
在面向对象编程中,继承是一种非常常见的技术,它可以帮助我们实现代码的复用,减少代码的冗余,并提高代码的可维护性和可扩展性。在继承中,方法的重写是一种非常重要的概念,它可以帮助子类实现自己特殊的需求,从而增强代码的可用性。
为了更好地理解方法重写,我们可以通过一个具体的例子来进行说明。假设我们有一个父类叫做Person,它有两个属性:姓名和年龄。我们还有两个子类,一个是Student,它除了继承Person类的属性外还有一个学号属性;另一个是Teacher,它除了继承Person类的属性外还有一个教龄属性。
在这个例子中,我们可以通过重写方法来实现子类的特殊需求。例如,在Student类中,我们可以重写info方法,以输出学号这一特殊属性。而在Teacher类中,我们则可以重写info方法,以输出教龄这一特殊属性。通过重写方法,我们可以让子类更好地满足自己的需求,从而增强代码的可用性。
在实际开发中,方法重写是非常常见的。在使用方法重写时,我们需要注意以下几点:
父类中的方法必须是可重写的。
子类中的方法必须和父类中的方法具有相同的名称、参数列表和返回类型。
子类中的方法必须使用@Override注解来标识它是对父类中方法的重写。
子类中的方法可以调用父类中的方法,以实现重写过程中需要继承的代码。
总之,方法的重写是面向对象编程中的一种重要概念,它可以帮助子类实现自己特殊的需求,从而增强代码的可用性。在实际开发中,我们应该注意使用方法的重写技术,以提高代码的可维护性和可扩展性。同时,我们还应该注意遵循方法重写的规范,以确保代码的正确性和可读性。

  • object类

我们将探讨Python中的object类。object是一种负类,它是所有类的默认基类,如果一个类没有继承任何其他类,则默认继承object类。因此,所有类都会有object类的属性和方法。我们可以使用内置函数DIR来查看指定对象的所有属性。
让我们新建一个Python文件,命名为DEMO6。在其中定义一个名为student的类。如果该类没有继承其他类,则默认继承object类。在该类中,我们并没有定义任何属性或方法。然后,我们创建了一个名为Stu的对象。我们可以使用DIR将Stu放进来,查看它所具有的属性和方法。你会发现,Stu拥有很多属性和方法,这些属性和方法都不是我们在student类中定义的,而是从object类中继承过来的。也就是说,这些属性和方法是它可以使用的。object类有一个名为str的方法,用于返回一个对象的描述。
当我们输出Stu时,我们发现它输出的是一个内存地址。这是因为默认情况下,str方法返回的是对象的内存地址。但我们可以重写str方法,使其返回对象的属性值。在student类中,我们定义了一个名为def的方法。我们使用了从object类继承而来的方法need。我们还定义了两个属性:name和age。然后,我们调用name属性,复制它,再调用age属性。现在,我们想要重写str方法,使其返回这些属性的值。我们可以使用def str关键字来重写str方法。我们返回一个包含属性值的字符串。例如,我们可以返回一个以“我的名字是”开头的字符串,接着是name属性的值,然后是“今年几岁了”,最后是age属性的值。
现在,我们运行程序。我们发现程序提示我们需要提供name和age参数。这是因为我们在定义student类时,定义了这两个属性,所以我们需要为它们提供值。我们提供一个名为“张三”的参数值和一个年龄为20岁的参数值。然后,我们再次运行程序。现在,我们看到的输出是“我的名字是张三,今年20岁”。注意,此时输出不再是内存地址,而是我们在str方法中定义的字符串。
我们再次使用DIR函数来查看Stu对象的属性和方法。我们发现,它依然是一个student类型的对象,但是现在输出的是我们在str方法中定义的字符串,而不是内存地址。
在Python中,我们经常会重写str方法,以便返回对象的属性值而不是内存地址。但是,我们需要注意的是,如果我们直接输出该对象,Python会默认调用str方法。因此,如果我们重写了str方法,则输出的内容将是str方法中定义的字符串。
object类还有很多其他方法,我们将在后续的特殊属性和特殊方法中进行讲解。

  • 多态的实现

在面向对象编程中,我们已经讲了封装和继承,接下来我们来谈一谈多态。简单来说,多态就是指一种事物具有多种形态,具体是指什么呢?即使你不知道一个变量所引用的对象到底是什么类型,你仍然可以通过这个变量调用方法。在运行过程中,它会根据变量所引用对象的类型动态决定调用哪个对象的一个方法。实际上,有人说Python中没有多态的概念,因为Python中的变量是没有数据类型的。然而,尽管变量在Python中没有数据类型,但是它具备多态的特征。
下面,我们来演示一下多态的概念。首先,我们有一个类的继承关系图,其中animal继承了object,并且拥有一个吃的方法。然后,我们定义了一个dog类去继承animal,也定义了一个cat类去继承animal。因此,dog和cat是animal的子类,或者说animal是dog和cat的一个父类。此外,我们的object还有一个类叫做Persian,它也继承了object,但是它是人类,也会吃东西。
接下来,我们定义了一个函数,并且你可以给我传一个对象,然后我就会调用这个对象的吃的方法。无论你传入的是dog还是cat,甚至是person,程序都不会报错。但是,person和我们的dog和cat之间没有继承关系,为什么还能调用吃的方法呢?这就是鸭子类型的特点。在动态语言中,你可以在创建对象之后动态地绑定属性和方法,所以这种语言多崇尚鸭子类型。当看到一只鸟走路像鸭子,游泳像鸭子,那么这只鸟就可以称之为鸭子。在鸭子类型中,你不需要关心对象是什么类型,只需要关心它的行为即可。
静态语言和动态语言都可以实现多态,但是实现方式不同。静态语言实现多态需要明确继承关系并且使用副类引用指向子类对象,而动态语言只关心对象是否具有方法。在动态语言中,我们不需要关心对象的类型,只需要关心它是否具有这个方法。这就是动态语言和静态语言实现多态的区别。
总之,多态是一种事物具有多种形态的特征,它可以让我们的程序更加灵活和强大。在动态语言中,我们可以随意创建对象并且动态地绑定属性和方法,这就使得多态更加容易实现。相比之下,静态语言在实现多态时需要明确继承关系,并且使用副类引用指向子类对象,这就使得静态语言的实现方式更加繁琐和复杂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

趋势洞察库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值