(十一)Python中级知识-面向对象之封装、集成、多态

本文详细解析了Python语言中的封装、继承和多态三大面向对象特性。通过实例演示了如何使用@property装饰器实现封装,继承的语法及多态的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

回顾一下java语言的封装、集成、多态三大特性的定义:

  • 封装的定义:是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。 具体实现:会将属性设置为私有属性,同时对外提供一组访问方法,如get 、set 方法来实现对对象属性的间接访问。
  • 继承的定义:是从已有的类(父类)中派生出新的类(子类),新的类能吸收已有类的属性和行为,并能扩展新的能力。 具体实现:使用 extends 关键字来继承父类的属性和方法,拥有继承关系后,子类中便可以调用父类中可访问的属性或方法。
  • 多态定义:是同一个行为具有多个不同表现形式或形态的能力。 在现实生活中的理解:比如为手机充电的这个能力,早期是直插式的圆孔充电头、中期出现了Mini USB插口、再到后来出现了不分正反面的Type C插口,而他们实现为手机充电的接口方式都不同。
    一般来说具体的实现有两种方式:一种是覆写(又叫重载)父类的方法; 另外一种是通过implements关键字实现接口类。

有了上述的参照之后,我们来看看Python3中对于这三大特性是如何使用的。

1、封装

在Python中我们可以使用 装饰器@property 这个注解来实现get set方法的注入。
举个例子:

class People:

    # 装饰器 实现get方法
    @property
    def name(self):
        return self.__name

    # 因为@property有它,所以才会创造出 @name.setter 他 即 实现set 方法
    @name.setter
    def name(self, name):
        self.__name = name

    def walk(self):
        print("直立行走")


p = People()
p.name="男人"

print(p.name)

输出结果:

男人

简要说明下:__name 属性直接不用在方法外定义,因为不需要设置特殊的默认值。
必须先添加了@property(对应getName方法)才能生成@name.setter(对应setName方法)。

2、继承

在Python中没有extends关键字,而是通过在类名后面添加括号放入父类名称来实现的。子类继承父类后就可以调用父类中公有的属性和方法。

继承语法格式如下:
class 类名 (父类名):
	# 属性
	# 方法

举个例子:

class People:

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, name):
        self.__name = name

    def walk(self):
        print(self.__name + "可以直立行走")


class Man(People):
    def hunt(self):
        print(super().name + "具备打猎的能力")


p = Man()
p.name = "男人"

# 调用父类的方法
p.walk()
# 调用子类的方法
p.hunt()

输出结果:

男人可以直立行走
男人具备打猎的能力

与java相比,在Python中延伸出了多重继承;实际上却又有点像java的实现接口方式,只是没有括号和implements关键字。

多继承语法格式如下:
class 类名 (父类名1,父类名2,父类名3):
	# 属性
	# 方法

举个例子:

# 男人类
class Man():

    @property
    def highIQ(self):
        return self.__highIQ

    @highIQ.setter
    def highIQ(self, iq):
        self.__highIQ = iq

    def hunt(self, name):
        print(name + "具备打猎的能力")


# 女人类
class Woman():

    @property
    def highEQ(self):
        return self.__highEQ

    @highEQ.setter
    def highEQ(self, eq):
        self.__highEQ = eq


# 仿生机器人类
class Robot(Man, Woman):

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, name):
        self.__name = name


r = Robot()
r.name = "机器人A"

r.highIQ = 130
r.highEQ = 120

print(r.name + "的智商高达:", r.highIQ)
print(r.name + "的情商高达:", r.highEQ)

# 调用子类的方法
r.hunt(r.name)

输出结果:

机器人A的智商高达: 130
机器人A的情商高达: 120
机器人A具备打猎的能力

3、多态

在Python3中没有像java一样的接口这个定义,但是我们可以通过覆写(重载)来实现多态性。

举个覆写的例子:

# 父类
class People:
    def run(self):
        print("人可以奔跑")


# 子类
class Robot(People):
    def run(self):
        print("机器人可以用手和脚进行快速奔跑")


# 调用
r = Robot()
r.run()

# 用子类对象调用父类已被覆盖的方法
super(Robot, r).run()

输出结果:

机器人可以用手和脚进行快速奔跑
人可以奔跑

根据例子可以看到,虽然子类可以调用父类的run方法,但是因为子类覆写了run方法,就不会去调用父类的run方法,而是直接调用子类的run方法。

4、总结

python3中没有java中的接口这个概念,但是具有多重继承的特性。
对于get和set 方法可以自己手写,也可以通过装饰器@property进行注入。
与java一样也有super关键字,可以通过其调用父类的方法属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值