作者主页:编程指南针
作者简介:Java、前端、Python开发多年,做过高程,项目经理,架构师
主要内容:Java项目开发、毕业设计开发、面试技术整理、最新技术分享
收藏点赞不迷路 关注作者有好处
文末获得源码
Python进阶学习
一,类和对象
1.1 面向对象概述
面向对象(Object Oriented)的英文缩写是OO,它是一种设计思想,从20世纪60年代提出面向对象的概念到现在,它已经发展成为一种比较成熟的编程思想,并且逐步成为目前软件开发领域的主流技术。
面向对象中的对象(Object),通常是指客观世界中存在的对象,这个对象具有唯一性,对象之间各不相同,各有各的特点,每一个对象都有自己的运动规律和内部状态;对象与对象之间又是可以相互联系、相互作用的。对象也可以是一个抽像的事物。通常将对象划分为静态部分和动态部分,静态部分指对象自身的一些属性,动态部分是对象所执行的一些动作。
类是封装对象的载体,它通过定义公共的属性来方法来描述对象。比如人类(Person),都有自己的姓名、年龄、身高、体重等属性,也可以吃、睡、坐、走等行为,用类来进行描述,可以通过类来创建一个个属性和形态可不相同的具体对象,也就是个人。
面向对象程序设计的三大特征:封装、继承和多态。
1.2 类的定义和使用
在Python中,使用class关键定来定义类:
Class ClassName:
'''帮助信息'''
statement
示例:如果在定义类时,没想好编码如何编写,可以使用pass来设置空代码(占位符)
Class Person:
pass
创建类的实例:
instancename = ClassName(parameterList)
在定义类时,通常会自动创建一个 ‘_ init _()’方法,它相当于Java中的构造方法,在进行实例对象创建时,会自动执行它。它必须包含一个self参数,用于引用自身的属性和方法,也可以添加其它参数。当它只有一个参数时,使用类进行实例化时,就不需要传递参数了。
示例:
#定义类
class Geese:
'''大雁类'''
def __init__(self):
print("我是大雁类")
wildGoose = Geese()
‘_ init _()’方法中,也可以自定义一些参数:
示例:
#定义类
class Geese:
'''大雁类'''
def __init__(self,beak,wing,claw):
print("我是大雁类,我有以下特征:")
print(beak)
print(wing)
print(claw)
beak = '喙的基部较高,长度和高度基本一致'
wing_1 = '翅膀长而尖'
claw_1 = '爪子是噗状的'
wildGoose = Geese(beak,wing_1,claw_1)
1.3 创建类的成员并进行访问
类的成员主要由实例方法和数据成员组成,在类中创建了类的成员后,可以通过类的实例进行访问。
1.创建实例方法并进行访问:
实例方法也就是在类中定义的函数,它必须包含一个self参数,而且必须是第一个,语法如下:
def functionname(self,parameterlist)
block
定义好实例方法后就可以通过实例名来进行调用了:
instancename.functionname(parameterlist)
2.创建数据成员并进行访问:
数据成员是指类中定义的变量,即属性。根据定义的位置,又分为类属性和实例属性。
类属性是指定义在类中,并在函数体外的属性。类属性可以被所有的实例共享访问。可以通过类名或实例名称进行访问。
示例:
#定义类 类属性
class Geese:
'''大雁类'''
beak = '喙的基部较高,长度和高度基本一致'
wing = '翅膀长而尖'
claw = '爪子是噗状的'
def __init__(self):
print("我是大雁类,我有以下特征:")
print(Geese.beak)
print(Geese.wing)
print(Geese.claw)
wildGoose = Geese()
实例属性是指定义在类的方法中的属性,只作用于当前实例中。实例属性只能通过实例名访问,不能通过类名访问。
示例:
#定义类 实例属性
class Geese:
'''大雁类'''
def __init__(self):
self.beak = '喙的基部较高,长度和高度基本一致'
self.wing = '翅膀长而尖'
self.claw = '爪子是噗状的'
print("我是大雁类,我有以下特征:")
print(self.beak)
print(self.wing)
print(self.claw)
wildGoose = Geese()
实例属性也是通过实例名修改访问:
#定义类
class Geese:
'''大雁类'''
def __init__(self,beak,wing,claw):
self.neck = '脖子较长'
print(self.neck)
wildGoose = Geese()
wildGoose1 = Geese()
wildGoose1.neck = '脖子没有天鹅长'
print('wildGoose的脖子:',wildGoose.neck)
print('wildGoose1的脖子:',wildGoose1.neck)
1.4 访问限制
为了保证类中定义的属性和方法不被外部进行访问,Python提供了加单下划线的 _ foo,双下划线的 _ _ foo和首尾都加下载线的 _ foo_ 来进行访问限制。foo此时代下属性或访问名。
_ foo _:表示定义特殊访问,比如初始化方法 _ _init _ _
_ foo:以单下划线开头的表示定义的protected(受保护的)成员,只能通过类和其子类进行访问。但不能使用"from module import *"来进行导入。
示例:
#访问限制
class Swan:
'''天鹅类'''
_neck_swan = '天鹅的脖子很长' #定义保护类型属性
def __init__(self):
print("__init__():"+Swan._neck_swan) #在实例访问中访问私有属性
swan = Swan() #创建Swan类的实例
print("直接访问:",swan._neck_swan) # 保护属性可以通过实例名访问
_ _foo:双下划线表示private(私有)类型成员。只允许该类中的方法进行访问,而不能通过实例进行访问。但可以通过’实例名.类名 _ 成员名称’进行访问。
示例:
#访问限制 私有属性
class Swan:
'''天鹅类'''
__neck_swan = '天鹅的脖子很长' #定义私有类型属性
def __init__(self):
print("__init__():"+Swan._neck_swan) #在实例访问中访问私有属性
swan = Swan() #创建Swan类的实例
print("加入类名:",swan._Swan__neck_swan) #私有属性,可以通过 “实例名.类名__xxx" 方式访问
print("直接访问:",swan._neck_swan) # 私有属性不可以通过实例名访问
1.5 属性
在python中,可以通过@property将一个方法转换为属性,从而实现用于计算的属性。将方法转换为属性后,可以直接通过方法名来访问方法,而不需要再添加一对小括号“()”,这样可以让代码更加简洁。
@property
def methodname(self):
block
* methodname :方法名
* self:必要参数,表示类的实例
* block: 方法体
示例:
#定义属性
class Rect:
def __init__(self,width,height):
self.width = width #矩形的宽
self.height = height #矩形的高
@property #将方法转换为属性
def area(self): #计算机矩形的面积的方法
return self.width*self.height #返回矩形面积
rect = Rect(800,600) #创建类的实例
print("面积为:",rect.area) #输出属性的值
在Python中,默认情况下,创建的类属性或者实例,是可以在类体外进行修改的,如果想要限制其不能在类体
外修改,可以将其设置为私有的,但设置为私有后,在类体外也不能获取它的值。所以如果想要创建一个可以读取,但不能修改的属性,可以使用@property 实现只读属性。
示例:
#创建只读属性
class TVShow:
def __init__(self,show):
self.__show = show
@property #将方法转换为属性
def show(self): #定义show()方法
return self.__show #返回私有属性的值
tvshow = TVShow("正在播放 青春无悔") #创建类的实例
print("默认:",tvshow.show) #获取属性值
但如果你想修改show 的值,就会报错:
tvshow.show = '正在播放 大决战'
print("修改后:",tvshow.show)
报错:
AttributeError: can't set attribute
1.6 继承
继承可以实现代码的重用,同时通过继承可以理顺类与类之间的关系。
class ClassName(baseclasslist):
'''类的帮助信息''' #类文档字符串
statement #类体
* baseclasslist:用于指定要继承的基类,可以有多个,类名之间用 ,号分隔,如果不指定,将使用所有Python对象的根类object.
方法重写:基类的成员都会被派生类继承,当基类中的某个方法不完全适用于派生类时,就需要在派生类中重写父类的这个方法。
示例:
#继承
class Fruit:
color = '绿色'
def harvest(self,color):
print("水果是:"+color+"的!")
print("水果已经收获.....")
print("水果原来是:"+Fruit.color+"的!")
class Orange(Fruit):
color = "橙色"
def __init__(self):
print("\n 我是橘子")
def harvest(self,color):
print("橘子是"+color+"的!")
print("橘子已经收获....")
print("橘子原来是:"+Fruit.color+"的!")
orange = Orange()
orange.harvest("黄色")
调用基类的 _ _init _ _方法需要通过 super() 来调用:
#调用父类的__init__方法
class Fruit:
def __init__(self,color="绿色 "):
Fruit.color = color
def harvest(self):
print("水果原来是: "+Fruit.color+"的!")
class Apple(Fruit):
def __init__(self):
super().__init__()
print("我是苹果")
apple = Apple()
apple.harvest()