Python从入门到实践
第九章 类
创建和使用
类即对对象进行实例化,在C++面向对象中体现的很淋漓尽致
基本概念
首先介绍一些基本的概念:
1.类中的函数称为方法
2.__init__()函数是一个特殊的方法,相当于C++的构造函数,在类创建时自动执行
3.__init_()函数前面的下划线是为了避免默认方法和普通方法混淆而形成的约定,必须这样写,在构造实例时才可以使用该构造函数
4.self相较于其他形参较为特殊的地方在于类进行实例化的时候,都将自动传入self形参,起一个指向实例的作用
大概可以理解为灵魂和肉体的关系?
且self变量会自动传递,因此我们不需要传递他
5.以self为前缀的变量都可以供给类中的所有方法进行使用,我们还可以通过类的任何实例来访问这些变量
接下来我们来做一个示例
#example
class Dog() :
'''一次模拟小狗的简单尝试'''
def __init__(self,name,age):
'''初始化属性name和age'''
self.name = name
self.age = age
def sit(self):
'''模拟小狗被命令时蹲下'''
print(self.name.title() + 'is now sitting')
def roll_over(self):
'''模拟小狗被命令时打滚'''
print(self.name.title() + 'rolled over!')
根据类来创建实例
以上我们已经定义好了一个表示特定小狗的实例
接下来我们来实例化:
# 构造时,使用类名,传参时会调用__init__()函数进行初始化
mydog = Dog('willie',6)
print("My dog's name is " + mydog.name.title() + '.' )
print("My dog is " + str(mydog.age) + " years old.")
mydog.sit();
mydog.roll_over();
# OUTPUT
My dog's name is Willie.
My dog is 6 years old.
Willieis now sitting
Willierolled over!
注意:
创建实例我们可以创建多个,
类只是一个灵魂或是内在,其肉体或是外表可以有多个
使用类和实例
实例其实是方便模拟现实世界很重要的工具,当类编写好之后,我们可以不断的创建新的对象来不断的进行开发,本次学习我使用Car类来进行学习
class Car():
def __init__(self,make,model,year):
'''初始化相关属性'''
self.make = make
self.model = model
self.year = year
def get_descriptive_name(self):
'''返回整洁的描述性信息'''
long_name = str(self.year) + ' ' + self.make + ' ' + self.model
return long_name.title()
my_newcar = Car('audi','a4',2016)
print(my_newcar.get_descriptive_name())
# OUTPUT
2016 Audi A4
给属性设置默认值
通常我们可以在构造函数里给类的属性添加默认值,例如:
def __init__(self,make,model,year):
'''初始化相关属性'''
self.make = make
self.model = model
self.year = year
'''在此处我们默认设置一个汽车里程的属性的默认值为0'''
self.odometer_reading = 0
我们可以通过直接对属性的值进行操作,也可以通过写方法来对属性进行操作
def increment_odometer(self,miles):
'''将里程表读数增加指定的量'''
self.odometer_reading += miles
return self.odometer_reading
通过以上方法,我们可以将里程表的读数进行增加操作
继承
子类的方法
在创建子类的实例时,Python首先需要完成的任务是给父亲所有的属性赋值,
为此,子类的方法__init__()需要父亲。
我们以电动车举例,继承自上述的Car()类
# 继承自哪个类先写清楚
class Electiccar(Car):
'''电动汽车,继承自汽车'''
def __init__(self,make,model,year):
'''初始化父类属性'''
# super()是一个特殊函数,帮助父类和子类的关联
# 该函数让Electiccar子类包含父类的所有属性,即父类为superclass
super().__init__(make,model,year)
# 先将父类的属性导入后我们就可以添加子类的属性了
self.battery_size = 70
def describe_battery(self):
'''打印一条描述电瓶容量的消息'''
print('this car has a ' + str(self.battery_size) + '-kwh battery.')
注意super()函数后面的属性必须是父类里面的,需要添加的属性在下面定义
重写父类的方法
在子类中,如果要对父类的方法进行重写,我们可以直接重写该方法,
Python会自动判断子类的方法为最新版本运行
例如:
def Electiccar(Car):
'''假设Car父类里包含fill_gas_tank函数,我们需要在子类中重写'''
def fill_gas_tank:
'''电动车没有油箱'''
print ('This car doesn't need a gas tank !')
将实例用作属性
我们将电池抽象成一个类:
class Battery():
'''定义一个电池类'''
def __init__(self,battery_size = 70):
self.battery_size = battery_size
def describe_battery(self):
'''打印一条描述电瓶容量的消息'''
print('this car has a ' + str(self.battery_size) + '-kwh battery.')
这样我们在定义电车的类时我们将Battery属性改为该类
class Electiccar(Car):
'''电动汽车,继承自汽车'''
def __init__(self,make,model,year):
'''初始化父类属性'''
# super()是一个特殊函数,帮助父类和子类的关联
# 该函数让Electiccar子类包含父类的所有属性,即父类为superclass
super().__init__(make,model,year)
# 先将父类的属性导入后我们就可以添加子类的属性了
self.battery_size = Battery()
那么我们在实例化后,可以访问到Battery类里面的函数:
my_tesla = Electiccar('tesla','model x',2018)
my_tesla.battery_size.describe_battery()
# OUTPUT
this car has a 70-kwh battery.
导入类
使用import进行导入即可
# 单个类
from car import Car
# 多个类
from car import Car,Electiccar
Python标准库
Python官方库,可以导入其中的各类模块进行使用
小结
本章节针对Python的类进行了学习,整体来说相较于C++来说理解上更加简单,语法也更加易懂