在面向?qū)ο蟮氖澜缋铮?br> 你的代碼通常稱為
類的方法
method
,
而數(shù)據(jù)通常稱為類的屬性
attribute
躏仇,
實(shí)例化的數(shù)據(jù)對(duì)象通常稱為實(shí)例
instance
雕拼。
Python使用class
創(chuàng)建類。每個(gè)定義的類都有一個(gè)特殊的方法歼捏,名為__init__()
稿存,可以通過這個(gè)方法控制如何初始化對(duì)象。
類中方法的定義與函數(shù)的定義類似瞳秽,基本形式如下:
class Athlete:
def __init__(self):
# The code to initialize a "Athlete" object.
1. __init__()方法
有了類之后瓣履,創(chuàng)建對(duì)象實(shí)例很容易。只需將對(duì)類名的調(diào)用賦至各個(gè)變量练俐。通過這種方式袖迎,類(以及__init__()
方法)提供了一種機(jī)制,允許你創(chuàng)建一個(gè)定制的工廠函數(shù)腺晾,用來(lái)根據(jù)需要?jiǎng)?chuàng)建多個(gè)對(duì)象實(shí)例燕锥。
與C++系列語(yǔ)言不同,Python中沒有定義構(gòu)造函數(shù)new
的概念悯蝉。Python會(huì)對(duì)你完成對(duì)象構(gòu)建归形,然后你可以使用__init__()
方法定制對(duì)象的初始狀態(tài)。
2. self參數(shù)
Python處理實(shí)例化a = Athlete()
時(shí)泉粉,把工廠函數(shù)調(diào)用轉(zhuǎn)換為了Athlete().__init__(a)
连霉,也就是說,Python會(huì)將實(shí)例的目標(biāo)標(biāo)識(shí)符a
賦至self
參數(shù)中嗡靡,這是一個(gè)非常重要的參數(shù)賦值。如果沒有這個(gè)賦值窟感,Python解釋器無(wú)法得出方法調(diào)用要應(yīng)用到哪個(gè)對(duì)象實(shí)例讨彼。
注意:
類代碼設(shè)計(jì)為在所有對(duì)象實(shí)例間共享:方法是共享的,而屬性不共享柿祈。self
參數(shù)可以幫助標(biāo)識(shí)要處理哪個(gè)對(duì)象實(shí)例的數(shù)據(jù)哈误。
每一個(gè)方法的第一個(gè)參數(shù)都是self
。
class Athlete:
def __init__(self, a_name, a_dob=None, a_times=[]):
self.name = a_name
self.dob = a_dob
self.times = a_times
def top3(self):
return(sorted(set([sanitize(t) for t in self.times])) [0:3])
def add_time(self, time_value):
self.times.append(time_value)
def add_times(self, list_of_times):
self.times.extend(list_of_times)
3. 繼承
可以繼承l(wèi)ist類創(chuàng)建AthleteList類躏嚎,list類自帶append()
和extend()
方法
class AthleteList(list):
def __init__(self, a_name, a_dob=None, a_times=[]):
list.__init__([])
self.name = a_name
self.dob = a_dob
self.extend(a_times)
def top3(self):
return (sorted(set([sanitize(t) for t in self])) [0:3])
4. 代碼示例
def sanitize(time_string):
if '_' in time_string:
splitter = '_'
elif ':' in time_string:
splitter = ':'
else:
return(time_string)
(mins, secs) = time_string.split(splitter)
return(mins + '.' + secs)
class AthleteList(list):
def __init__(self, a_name, a_dob=None, a_times=[]):
list.__init__([])
self.name = a_name
self.dob = a_dob
self.extend(a_times)
def top3(self):
return (sorted(set([sanitize(t) for t in self])) [0:3])
def get_coach_data(filename):
try:
with open(filename) as f:
data = f.readline()
templ = data.strip().split(',')
return (Athlete(templ.pop(0), templ.pop(0), templ))
except IOError as ioerr:
print('File error: ', + str(ioerr))
return(None)
james = get_coach_data('james2.txt')
print(james.name + "'s fastest times are: " + str(james.top3()))