回顾一下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关键字,可以通过其调用父类的方法属性。