python3.6:基础语法:类
在以前刚刚开始学c++的时候,因为习惯了学习过的c语言设计“基于过程”的思维方式,有很长一段时间都不习惯类和对象的概念。当然完全理解了类和对象的概念之后再回头想,就觉得“类”和“对象”这个名称其实很形象也很好理解。
”类“,一类事物,包含了一系列共同特征和行为的一大类对象的集合。
”对象“,基于类创建的对象是这类事物中一个个体,它具备这类事物通用的特征和行为,也可以具有自己独特的特性。
所以类是模糊的,而对象是具体的。比如人是一个类,那么李小明这个人就可以是人这个类的一个对象。那么假如世界上有千千万万个重名的李小明,那么李小明也可以是一个类,但同班的那个170cm高/75kg/长得黑的同学李小明就是这个”李小明“类的一个对象,而身高体重肤色这些,就是他的属性。
1.创建和使用类
(1)简单的类的创建和使用:
1)类的创建:
# “人”类的创建
class People():
# 【1】__init__()为构造函数,每次创建实例时自动调用
# 形参self是一个指向实例本身的引用,让实例可以访问类的属性和方法
def __init__(self, height, weight, name):
# height、weight和name是类的两个属性,当创建实例时自动用给出的实参赋给形参并初始化两个属性
self.height = height
self.weight = weight
self.name = name
# 【2】定义类的两个方法,分别是say_hi()和say_bye()
def say_hi(self):
print(self.name, 'says:', 'Hi everyone!')
def say_bye(self):
print(self.name, 'says:', 'Goodbye everyone!')
2)类的使用:
下面根据上一节创建的people类创建一个“李小明”的实例,他的身高为170cm,体重为75kg。
# 创建people类的实例LiXiaoming
# height属性值为170,weight属性值为75,name属性值为‘LiXiaoming’
LiXiaoming = People(170, 75, ‘LiXiaoming’)
# 调用实例LiXiaoming的两个方法
LiXiaoming.say_hi()
LiXiaoming.say_bye()
# 访问实例LiXiaoming的两个属性
print(LiXiaoming.height)
print(LiXiaoming.weight)
也可以创建多个类的实例,如“张小红”、“王小强”、“高小文”。
ZhangXiaohong = People(160, 50, 'ZhangXiaohong')
WangXiaoqiang = People(180, 60, 'WangXiaoqiang')
GaoXiaowen = People(175, 90, 'GaoXiaowen')
3)类的属性操作:
a.设定属性默认值:
设定属性默认值有两种方式。
第一种是在构造函数中以函数默认值的方式给出,如下面代码中的hair_style属性,它在构造函数的形参列表中给出,在创建实例时这个值可以给出实参,那么实参将覆盖原默认值,如果不给出实参,那么将由默认值对这个属性进行初始化。
第二种是在构造函数内部给出,,如下面代码中的finger_numbers那么这个属性名将不作为构造函数的参数,在创建实例时也不可以对这个属性再进行赋值,只能由默认值初始化这个属性,后续可通过修改属性值进行修改。
# 创建people类
class People( ):
#1.hair_style属性在形参列表中给出默认值
def __init__(self, height, weight, hair_style='long'):
self.height = height
self.weight = weight
self.hair_style = hair_style
#2.finger_numbers属性在构造函数函数体中给出默认值
self.fingers_number = 10
# 实例1:hair_style和finger_number属性均直接使用默认值
LiXiaoming = People(170, 75)
print(LiXiaoming.hair_style)
print(LiXiaoming.fingers_number)
# 实例2:hair_style由给定实参赋值,finger_number直接使用默认值
ZhangXiaohong = People(160, 45, 'short')
print(ZhangXiaohong.hair_style)
print(ZhangXiaohong.fingers_number)
b.修改属性值:
1.直接修改属性值:
# 代码接上一节的people类
# 1.创建实例,输出属性值
LiXiaoming = People(170, 75)
print(LiXiaoming.hair_style)
print(LiXiaoming.fingers_number)
# 2.修改实例的属性值,再次输出属性值
LiXiaoming.weight = 80
LiXiaoming.hair_style = 'short'
print(LiXiaoming.weight)
print(LiXiaoming.hair_style)
2.通过方法修改属性值:
# 创建people类
class People( ):
def __init__(self, height, weight):
self.height = height
self.weight = weight
# taller()函数用于修改height属性值,调用函数在原有height基础上递增指定值
def taller(self, length):
self.height += length
# weight()函数用于修改weight属性值,调用函数直接替换原有weight属性值
def weight_change(self, weightnow):
self.weight = weightnow
# 创建实例李小明
LiXiaoming = People(170, 75)
# 修改height属性值
LiXiaoming.taller(2)
print(LiXiaoming.height)
# 修改weight属性值
LiXiaoming.weight_change(70)
print(LiXiaoming.weight)
2.继承
(1)继承的格式:
当需要创建的类是一个已经编写好的类的特殊版本,例如女人相对于人类、轿车相对于汽车,就可以用到继承。子类继承父类的所有属性和方法,也可以额外定义自己的属性和方法。
# 【1】创建people类
class People():
def __init__(self, height, weight, name):
self.height = height
self.weight = weight
self.name = name
# 定义类的两个方法,分别是say_hi()和say_bye()
def say_hi(self):
print(self.name, 'says:', 'Hi everyone!')
def say_bye(self):
print(self.name, 'says:', 'Goodbye everyone!')
# 【2】创建woman类,继承父类people类
# 注意此处括号内People
class Woman(People):
# 注意构造函数内容发生变化
def __init__(self, height, weight, name):
super().__init__(height, weight, name)
# 创建实例,访问继承父类的属性并调用继承父类的算法
ZhangXiaohong = Woman(163, 50, 'ZhangXiaohong')
print(ZhangXiaohong.height)
ZhangXiaohong.say_hi()
(2)子类添加属性和方法:
# 接上一节父类people类,创建People的子类woman类
class Woman(People):
# 子类新增参数hair_style
def __init__(self, height, weight, name, hair_style):
super().__init__(height, weight, name)
# 设置新增参数值hair_style
self.hair_style = hair_style
# 子类新增方法change_hair()
def change_hair(self):
if self.hair_style == 'short':
self.hair_style = 'long'
elif self.hair_style == 'long':
self.hair_style = 'short'
else:
self.hair_style = self.hair_style
# 创建woman类的实例ZhangXiaohong
ZhangXiaohong = Woman(163, 50, 'ZhangXiaohong', 'short')
# 输出子类新增的属性值
print(ZhangXiaohong.hair_style)
# 调用子类新增的方法
ZhangXiaohong.change_hair()
print(ZhangXiaohong.hair_style)
(3)重写父类方法:
当父类的方法不符合子类的需要时,可以对其进行重写,为此可以在子类中定义一个与之重名的方法,对该父类方法进行覆盖。
# 创建People类的子类woman类
class Woman(People):
def __init__(self, height, weight, name, hair_style):
super().__init__(height, weight, name)
self.hair_style = hair_style
def change_hair(self):
if self.hair_style == 'short':
self.hair_style = 'long'
elif self.hair_style == 'long':
self.hair_style = 'short'
else:
self.hair_style = self.hair_style
# 重写父类方法say_hi()
def say_hi(self):
print('a girl called', self.name, 'says:', 'Hi everyone!')
# 创建woman类的实例并调用重写后的方法say_hi()
ZhangXiaohong = Woman(163, 50, 'ZhangXiaohong', 'short')
ZhangXiaohong.say_hi()
(4)将实例作为属性:
当类中包含的内容过多时,可以创建一个新类,将原类的一部分属性和方法抽取出来放到其中,再将新类的一个实例作为原类的属性。通过这种方法可以将一个复杂的类拆分成若干个小类,使代码更加简洁明了。
# 创建Stature(身材)类,将与身材有关的属性和方法统一放到这个类中
class Stature():
def __init__(self, height, weight):
self.height = height
self.weight = weight
# taller()函数用于修改height属性值,调用函数在原有height基础上递增指定值
def taller(self, length):
self.height += length
# weight()函数用于修改weight属性值,调用函数直接替换原有weight属性值
def weight_change(self, weightnow):
self.weight = weightnow
# 创建people类,将Stature类实例化作为本类的一个属性
class People():
def __init__(self, name, height, weight):
self.name = name
# 将Stature类实例化并作为本类的属性
self.stature = Stature(height, weight)
# 定义类的两个方法,分别是say_hi()和say_bye()
def say_hi(self):
print(self.name, 'says:', 'Hi everyone!')
def say_bye(self):
print(self.name, 'says:', 'Goodbye everyone!')
# 创建people类的实例
LiXiaoming = People('LiXiaoming', 170, 75)
# 打印Lixiaoming关于身材的属性值
print(LiXiaoming.stature.weight)
print(LiXiaoming.stature.height)
3.类的导入
将创建的类放在people.py模块中,在另一个文件中导入people.py中的类有如下几种形式,也可以通过这种方式来使用python的标准库及其他程序员编写好的模块。
# 从people.py模块中导入People类
from people import People
# 从people.py模块中导入People类和Woman类
from people import People, Woman
# 导入people.py模块中的所有类
from people import *
# 导入people.py模块
import people