第十二章 python 类 - 面向对象的程序设计
12-1 类的定义与使用
-
类的语法定义如下:
-
class Classname() # 类名称第一个字母必须大写
statement1
…
statementn
-
-
本节将以银行为例,说明最基本的类观念。
12-1-1 定义类
-
例:Banks 的类定义
class Banks(): # 定义银行类别 title = "Taipei Bank" # 定义属性 def motto(self): # 定义方法 return "以客为尊" #输出结果(这个程序没有输出结果)
-
对上述程序而言,Banks 是类名称,在这个类中笔者定义了一个属性 title 与一个方法 motto 。
-
在类内定义方法的方式与第 11 章定义函数的方式相同,但是不可以称之为函数,必须称之为方法,在程序设计时我们可以随时调用函数,但是只有属于该类的对象才可调用相关的方法。
12-1-2 操作类的属性与方法
-
若是想操作类的属性与方法首先需定义该类的对象变量,可以简称对象,然后使用下列方式操作。
- object . 类的属性
- object . 类的方法 ( )
-
例:扩充上例,列出银行名称与服务宗旨。
class Banks(): # 定义银行类别 title = "Taipei Bank" # 定义属性 def motto(self): # 定义方法 return "以客为尊" userbank = Banks() # 定义对象 userbank print("目前的服务银行是:",userbank.title) print("银行的理念是 :",userbank.motto()) #输出结果 目前的服务银行是: Taipei Bank 银行的理念是 : 以客为尊
-
从上述执行结果可以发现我们成功地存取了 Banks 类内的属性与方法了。上述程序观念是,程序第 6 行定义了 userbank 当作是 Banks 类的对象,然后使用 userbank 对象读取了 Banks类内的 title 属性与 motto() 方法。这个程序主要是列出 title 属性值与 motto() 方法传回的内容。
12-1-3 类的构造函数
-
建立类很重要的一个工作是初始化整个类,所谓的初始化类是在类内建立一个初始化方法,这是一个特殊方法,当在程序内定义这个类的对象时将自动执行这个方法。初始化方法有一个固定名称是“ __init__ ( ) ”,写法是 init 左右皆是 2 个底线字符,init 其实是 initalization 的缩写,通常又将这类初始化的方法称构造函数。在这初始化的方法内可以执行一些属性变量设定,下列笔者先用一个实例做解说。
-
例:设定初始化方法,同时存第一笔开户的钱 100 元入银行,然后列出存款金额。
class Banks(): # 定义银行类别 title = "Taipei Bank" # 定义属性 def __init__(self,uname,money): # 初始化方法 self.name = uname # 设定存款者名字 self.balance = money # 设定所存的钱 def get_balance(self): # 获得存款金额 return self.balance hungbank = Banks("张三",100) print(hungbank.name.title(),"存款余额是:",hungbank.get_balance()) #输出结果 张三 存款余额是: 100
-
上述在程序 11 行定义 Banks 类的 hungbank 对象时,Banks 类会自动启动 __init__( ) 初始化函数,在这个定义中 self 是必需的,同时需放在所有参数的最前面(相当于最左边),Python 在初始化时会自动传入这个参数 self,代表是类本身的对象,未来在类内想要参照各属性与函数搪行运算皆要使用 self,可参考第 5、6、10 行。
-
在这个 Banks 类的 __init__( self , uname,money ) 方法中,有另外 2 个参数 uname 和 money,未来我们在定义 Banks 类的对象时需传递 2 个参数,分别给 uname 和 money。至于程序第 5、6行内容如下:
- self . name = uname # name 是 Banks 类的属性
- slef . balance = money # balance 是 Banks 类的属性
-
读者可能会思考,既然 __init__( ) 这么重要,为何一些例子没有这个初始化函数仍可运行,其实是使用预设没有参数的 __init__( ) 方法。
-
在程序第 8 行另外有一个 get_balance ( self ) 方法,在这个方法内只有一个参数 self,所以调用时可以不用任何参数,可以参考第 12 行。这个方法目的是传回存款余额。
-
例:增加执行存款与提款功能,同时在类内在以直接列出目前余额。
class Banks(): # 定义银行类别 title = "Taipei Bank" # 定义属性 def __init__(self,uname,money): # 初始化方法 self.name = uname # 设定存款者名字 self.balance = money # 设定所存的钱 def save_money(self,money): # 设计存款方式 self.balance += money # 执行存款 print("存款:" ,money," 完成") def withdraw_money(self,money): #设计提款方式 self.balance -= money print("提款:",money," 完成") def get_balance(self): print(self.name.title(),"目前余额",self.balance) hungbank = Banks("张三",100) # 实例化对象 hungbank.get_balance() hungbank.save_money(300) hungbank.get_balance() hungbank.withdraw_money(200) hungbank.get_balance() #输出结果 张三 目前余额 100 存款: 300 完成 张三 目前余额 400 提款: 200 完成 张三 目前余额 200
-
其实类建立完成了,我们随时可以使用多个对象引用这个类的属性与函数,可参考下列实例。
-
例:上面例子,定义 2 个对象使用操作这个类
class Banks(): # 定义银行类别 title = "Taipei Bank" # 定义属性 def __init__(self,uname,money): # 初始化方法 self.name = uname # 设定存款者名字 self.balance = money # 设定所存的钱 def save_money(self,money): # 设计存款方式 self.balance += money # 执行存款 print("存款:" ,money," 完成") def withdraw_money(self,money): #设计提款方式 self.balance -= money print("提款:",money," 完成") def get_balance(self): print(self.name.title(),"目前余额",self.balance) hungbank = Banks("张三",100) johnbank = Banks("李四",300) hungbank.get_balance() johnbank.get_balance() hungbank.save_money(100) johnbank.withdraw_money(150) hungbank.get_balance() johnbank.get_balance() #输出结果 张三 目前余额 100 李四 目前余额 300 存款: 100 完成 提款: 150 完成 张三 目前余额 200 李四 目前余额 150
12-1-4 属性初始值的设定
-
在先前程序的 Banks 类中第 3 行 title 是设为 “ Taipei Bank ”,其实这是初始值的设定,通常 Python 在设初始值时是将初始值设在 __init__( ) 方法内,下列这个程序定义 Banks 类对象时,省略开户金额,相当于定义 Banks 类对象时只要 2 个参数。
-
例:设定开户只要姓名,同时设定开户金额是 0 元,读者可留意第 5 和 6 行的设定。
class Banks(): def __init__(self,uname): #初始化方法 self.name = uname self.balance = 0 self.title = "Taipei Bank" def save_money(self,money): # 设计存款方式 self.balance += money # 执行存款 print("存款:" ,money," 完成") def withdraw_money(self,money): #设计提款方式 self.balance -= money print("提款:",money," 完成") def get_balance(self): print(self.name.title(),"目前余额",self.balance) hungbank = Banks("张三") print("目前开户银行",hungbank.title) hungbank.get_balance() hungbank.save_money(100