Python中的面向对象编程
Python中的面向对象编程,所谓OOP,就是在编程中通过创建“对象”来模拟现实中需要解决的问题中的实体的一种编程模式。“对象”定义了两部分内容:数据,一般称为“域”(field)或者“属性”(attribute),以及对数据的操作,一般称为方法(method)。在编程术语中,把对对象的类型定义称为“类”(class)。对象即是类的一个实例。
说到OOP就不得不提OOP的三个基本特征:
封装
就是把数据和操作数据的方法都定义在一个类的内部,这样做的目的是保证一个对象的内部结构只能被它暴露给外面的方法来改变,而别的对象无法改变其他对象的内部状态。
继承
通常我们在解决问题过程中建立的模型会形成很庞大的层次结构,而这些模型(类)之间有相互关系。在这个类的层次体系中的从属(isa)关系在OOP中使用继承来实现,也就是说在某个对象中存在的特性在它派生出的对象中也会存在。
e.g.假设你想架设自己的网上商店卖一些电子设备(Gadget)。这些Gadget有这些属性:电池容量,重量,内存容量,操作系统等。如果你想卖一个平板电脑(Tablet),你可以定义:平板电脑(Tablet)是一个“电子设备”(Gadget),在实现的代码中可以使用继承把Gadget类的所有属性和功能传递给平板电脑(Tablet)类。
多态
即某个对象由于其子类的存在而表现出某些与其自身定义方法不一样的特性。多态是与继承相关的特性。
举例来说,假如你想在你的网上商店里卖智能手表(SmartWatch).智能手表是属于Gadget类,所有的Gadget都可以重启(restart),因此重启可以作为Gadget类的方法。由于Tablet和SmartWatch都继承了Gadget类,因此都继承了restart这个方法,但是SmartWatch的restart操作和Tablet的restart操作并不相同.所有如果我们把SmartWatch和Tablet都重启一下,我们使用同样的restart方法,但是每个对象执行这个操作的时候调用自己的方法。也就是说,从更抽象的层次看,当对两个不同Gadget执行同样的restart操作时,由于各自类型的不同它们的行为是不同的。
Python是什么?
Python是动态类型的通用的高级编程语言,由GuidovanRossum在1991年设计开发并公布于众。
Python在当下是非常流行的编程语言,而由于有众多web框架如django,flask,bottlepy,pyramid等的存在,Python在web开发中得到广泛应用。
Python语言得名于Guido非常喜爱的MontyPython’sFlyingCircus.
2.x和3.x,我该用哪个版本?
Python2.7.x版本官方支持到2020年。Python核心开发团队承诺不会有Python2.8,而对2.x版本将只提供安全更新和bugfix.3.x分支早在2000年就发布,起初问题不断,但目前已工作良好。由于不提供向后兼容性,而大量的应用使用2.x版本实现,为了不破坏现有的应用,主流的linux发行版依旧默认提供2.x版本,因此目前转换到Python3.x版本有些困难。Python3.x版本可以在2.x版本存在的情况下便捷的安装并且使用而不会带来问题。
关于2.x与3.x版本区别的更多详细解释,优缺点等请参考:
Python.org–ShouldIusePython2orPython3formydevelopmentactivity?
TheTreehouseblog–Python2VSPython3
Python中的类
如上文所述,类是对象的类型定义。Python中对类的定义使用class关键字完成。
在Python编程中有一个惯例,通常一个.py文件中只包含一个类定义。虽然可以不这么做但是建议遵守这条规则。下面是对于上文举例的Gadget类的定义:
classGadget:
weight=100
operating_system=None
battery_capacity=2000
screen_size=1
my_iphone=Gadget()
Gadget类有四个属性:weight,operating_system,battery_capacity和screen_size.我们可以用类的名称加括号来创建新的实例:Gadget()。但是看一下Gadget类各个属性的默认值,考虑到iPhone的实际情况,默认的属性值可能并不适用。我们需要一个方法,可以指定Gadget类的实例各个属性的值。这个用于帮助创建类实例的方法称为构造器(constructor).下面是一个Python中实现构造器(__init__)的例子。__init__在实例被创建后紧接着被调用,第一个参数为self,这是Python的惯例,代表刚刚被创建的对象。下面的例子展示了如何在构造器内部设置相关的属性:
classGadget:
weight=100
operating_system=None
battery_capacity=2000
screen_size=1
def__init__(self,weight,operating_system,battery_capacity,screen_size):
self.weight=weight
self.operating_system=operating_system
self.battery_capacity=battery_capacity
self.screen_size=screen_size
如果想知道给新对象设置了什么属性值,可以打印出来观察:
my_iphone=Gadget(weight=128,operating_system="iOS",battery_capacity=2800,screen_size=4)
print(my_iphone.weight)
print(my_iphone.operating_system)
print(my_iphone.battery_capacity)
print(my_iphone.screen_size)
但是这个解决方案有个问题,我们破坏了封装的特性:即可以直接访问my_iphone这个对象的内部状态,并且可以直接给screen_size或者operating_system等属性直接赋值。我们可以使用property关键字来避免这种直接操作属性的情形,使当前类成员对外部不可见:
译注:由于在英文中attribute和property翻译过来都是属性,为避免混淆,下文中property将不再翻译
classGadget:
"""AclassusedformodellingGadgetsinawebshop."""
__weight=100
__operating_system=None
__battery_capacity=2000
__screen_size=1
def__init__(self,weight,operating_system,battery_capacity,screen_size):
self.__weight=weight
self.__operating_system=operating_system
self.__battery_capacity=battery_capacity
self.__screen_size=screen_size
defget_weight(self):
returnself.__weight
defset_weight(self,weight):
self.__weight=weight
weight=property(get_weight,set_weight)
@property
defoperating_system(self):
returnself.__operating_system
@operating_system.setter
defoperating_system(selg,new_os):
self.__operating_system=new_os
我们可以通过用双下划线开头(__attribute_name)的形式来定义私有属性(更多详细信息参考….),同时我们可以定义setter和getter来访问和操作这些属性。getter和setter方法可以满足封装的需要,但是同时带来Java式的编程体验:类的属性变量可以通过get和set方法设置。
而对开发者更友好的方式是使用property。在上面的例子中我分别用两种方法创建了两个property:weight和operating_system。
在创建weightproperty的时候,我用weight=property(get_weight,set_weight).在Python类定义中如果事先已经实现了Java式的get/set方法,使用property(get...,set…)这种语法可以很便捷的给类增加property。
而在实现operating_systmproperty时,我用了另外一称为注释/装饰器的方法。
首先定义了get方法,但是省略了’get’关键字(注意operating_system这个使用@property装饰的方法只有一个参数self);然后创建了setter,同样也是命名为operating_system但有两个参数:self和new_os,new_os是将要给operating_system设置的值。
下面是例子:
>>>fromGadgetimportGadget
>>>my_iphone=Gadget(240,'iOS',1980,4)
>>>my_iphone.weight
240
>>>my_iphone.weight=255
>>>my_iphone.weight
255
>>>
>>>
>>>my_iphone.operating_system
'iOS'
>>>my_iphone.operating_system='iOS8.1'
>>>my_iphone.operating_system
'iOS8.1'
>>>
使用property非常简单,参考上面的例子。基本上property与公有的成员变量一样使用,但是通过getter和setter我们可以对将要设置的值进行验证.(例子中没有做任何验证,但事实上是可以的)
Python面向对象编程-第二部分很快发出来。
Python培训、Python培训班、Python培训机构,就选光环大数据!
还不够过瘾?想学习更多?点击 http://hadoop.aura.cn/python/ 进行Python学习!
大数据培训、人工智能培训、Python培训、大数据培训机构、大数据培训班、数据分析培训、大数据可视化培训,就选光环大数据!光环大数据,聘请专业的大数据领域知名讲师,确保教学的整体质量与教学水准。讲师团及时掌握时代潮流技术,将前沿技能融入教学中,确保学生所学知识顺应时代所需。通过深入浅出、通俗易懂的教学方式,指导学生更快的掌握技能知识,成就上万个高薪就业学子。 更多问题咨询,欢迎点击------>>>>在线客服!