Object Oriented Programming

類定義

class ClassName(BaseClassName):
  <statement 1>
  `
  `
  `
  <statement n>
  • ClassName是類名肢娘。遵循大駝峰原則呈础。
  • BaseClassName是父類的類名,無特殊父類為object橱健。
    示例
class BankAccount (object) :
  def __init__(self, name) :
    self.owner = name
    self.balance = 0
   def add (self , amount ) :
    self.balance += amount  
  def display(self) :
    print(self.owner, self.alance)
  • 第一個方法__init __()是一種特殊的方法而钞,稱為Python構造函數。
  • 聲明其他類方法拘荡,如正常函數臼节,每個方法的第一個參數是self。 Python將self參數添加到列表中; 調用方法時不需要包含它珊皿。

創(chuàng)建實例對象

要創(chuàng)建類的實例网缝,可以使用類名調用該類,并傳遞其init方法接受的任何參數蟋定。

b = BankAccount ( "Bart " )
b.add(100)
b.display( )

私有屬性

 def __init__(self, name) :
    self._owner = name
    self._balance = 0

下劃線用于表示將變量保持為private粉臊,所以最好不要在class外使用它。

類的繼承

面向對象的編程帶來的主要好處之一是代碼的重用驶兜,實現這種重用的方法之一是通過繼承機制扼仲。

通過繼承創(chuàng)建的新類稱為子類或派生類远寸,被繼承的類稱為基類、父類或超類屠凶。

class BankAccount(object):

    def __init__(self, name, pwd):
        self._owner = name
        self._pwd = pwd
        self._balance = 0
    def _authenticate(self,pwd):
        return self._pwd == pwd
    def add(self, amount, pwd):
        if self._authenticate(pwd):
            self._balance += amount
        else:
            print("error!")
    def __str__(self):
        return '%s: %i' % (self._owner, self._balance)


class GroupAccount(BankAccount):
    def __init__(self, name, pwd):
        super().__init__(name, pwd)
        self._holders = []
        self._pwds = []
    def addHoler(self, holder, pwd):
        self._holders.append(holder)
        self._pwds.append(pwd)
    def _authenticate(self,pwd):
        return pwd in self._pwds

a = BankAccount("bart", 111)
b = GroupAccount('Max', 222)
b.addHoler('john', 333)
b.addHoler('Tim', 444)
b . add (100 ,333)
b . add (100 ,123)
print(b)
  • super()代表父類驰后。super()__init__()表示用父類的構造方法構造子類的屬性。
  • 當使用print輸出對象的時候矗愧,只要自己定義了__str__(self)方法灶芝,那么就會打印從在這個方法中return的數據。

重寫方法

  • 方法重載是指同一個類中的多個方法具有相同的名字,但這些方法具有不同的參數列表,即參數的數量或參數類型不能完全相同

  • 方法重寫是存在子父類之間的,子類定義的方法與父類中的方法具有相同的方法名字,相同的參數表和相同的返回類型

可以隨時重寫父類的方法唉韭。 重寫父方法的一個原因是:您可能希望在子類中使用特殊或不同的方法功能监署。

class Parent:        # define parent class
   def myMethod(self):
      print ('Calling parent method')

class Child(Parent): # define child class
   def myMethod(self):
      print ('Calling child method')

c = Child()          # instance of child
c.myMethod()         # child calls overridden method
  • 子類的__init____str__方法也是方法寫纽哥。

多態(tài)

多態(tài)存在的三個必要條件:

  1. 繼承
  2. 重寫
  3. 父類引用指向子類對象(在java中 Person p = new Student();
    示例
class Person(object):#define Person class
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender
    def whoAmI(self):
        return 'I am a Person, my name is %s' % self.name

class Student(Person): #define Student class
    def __init__(self, name, gender, score):
        super(Student, self).__init__(name, gender)
        self.score = score
    def whoAmI(self):
        return 'I am a Student, my name is %s' % self.name

class Teacher(Person): #define Teacher class
    def __init__(self, name, gender, course):
        super(Teacher, self).__init__(name, gender)
        self.course = course
    def whoAmI(self):
        return 'I am a Teacher, my name is %s' % self.name

def who_am_i(x): #接收變量 x栖秕,則無論該 x 是 Person春塌、Student、Teacher簇捍,打印出結果:
    print(x.whoAmI())

p = Person('Tim', 'Male')
s = Student('Bob', 'Male', 88)
t = Teacher('Alice', 'Female', 'English')

who_am_i(p)
who_am_i(s)
who_am_i(t)

運行結果:

I am a Person, my name is Tim
I am a Student, my name is Bob
I am a Teacher, my name is Alice

這種行為稱為多態(tài)只壳。也就是說,方法調用將作用在 x 的實際類型上暑塑。s 是Student類型吼句,它實際上擁有自己的 whoAmI()方法以及從 Person繼承的 whoAmI方法,但調用 s.whoAmI()總是先查找它自身的定義事格,如果沒有定義惕艳,則順著繼承鏈向上查找,直到在某個父類中找到為止驹愚。
簡而言之,就是對父類方法的重寫并由此在子類中表現出所期望的形式远搪。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市逢捺,隨后出現的幾起案子谁鳍,更是在濱河造成了極大的恐慌,老刑警劉巖劫瞳,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件倘潜,死亡現場離奇詭異佑淀,居然都是意外死亡傍妒,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門殊者,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恨憎,“玉大人蕊退,你說我怎么就攤上這事郊楣。” “怎么了瓤荔?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵净蚤,是天一觀的道長。 經常有香客問我输硝,道長今瀑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任点把,我火速辦了婚禮橘荠,結果婚禮上,老公的妹妹穿的比我還像新娘郎逃。我一直安慰自己哥童,他們只是感情好,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布褒翰。 她就那樣靜靜地躺著贮懈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪优训。 梳的紋絲不亂的頭發(fā)上朵你,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音揣非,去河邊找鬼抡医。 笑死,一個胖子當著我的面吹牛早敬,可吹牛的內容都是我干的忌傻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼搁嗓,長吁一口氣:“原來是場噩夢啊……” “哼芯勘!你這毒婦竟也來了?” 一聲冷哼從身側響起腺逛,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤荷愕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后棍矛,有當地人在樹林里發(fā)現了一具尸體安疗,經...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年够委,在試婚紗的時候發(fā)現自己被綠了荐类。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡茁帽,死狀恐怖玉罐,靈堂內的尸體忽然破棺而出屈嗤,到底是詐尸還是另有隱情,我是刑警寧澤吊输,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布饶号,位于F島的核電站,受9級特大地震影響季蚂,放射性物質發(fā)生泄漏茫船。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一扭屁、第九天 我趴在偏房一處隱蔽的房頂上張望算谈。 院中可真熱鬧,春花似錦料滥、人聲如沸然眼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽罪治。三九已至,卻和暖如春礁蔗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背雁社。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工浴井, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人霉撵。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓磺浙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親徒坡。 傳聞我的和親對象是個殘疾皇子撕氧,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內容