本文深入分析了Python面向對象程序設計OOP。分享給大家供大家參考,具體如下:
下面是一個關于OOP的實例,模塊文件為person.py
# File person.py(start)class Person: def __init__(self, name, job=None, pay=0): self.name = name self.job = job self.pay = pay def last_name(self): return self.name.split()[-1] def give_raise(self, percent): self.pay = int(self.pay * (1+percent)) print('total percent:%f' % percent) def __str__(self): return '[Person: %s, %s]' % (self.name, self.pay)class Manager(Person): # 這是一種不太好的方法重載的方法,實際應用中我們采用下面的方法 def give_raise(self, percent, bonus=.1): self.pay = int(self.pay * (1+percent+bonus)) # 這個方法利用了這樣的一個事實:類方法總是可以在一個實例中調用。 # 其實常規的實例調用,也是轉換為類的調用 # instance.method(args...) 由Python自動地轉換為 class.method(instance,args...) # 所以要記得直接通過類進行調用時,必須手動傳遞實例,這里就是self參數 # 而且不能寫成self.give_raise,這樣會導致循環調用 # # 那么為什么采用這種形式呢?因為它對未來的代碼的維護意義重大,因為give_raise現在 # 只在一個地方,即Person的方法,將來需要修改的時候,我們只需要修改一個版本 def give_raise(self, percent, bonus=.1): Person.give_raise(self, percent+bonus)if __name__ == '__main__': # self-test code bob = Person('Bob Smith') sue = Person('Sue Jones', job='dev', pay=100000) print(bob) print(sue) print(bob.last_name(), sue.last_name()) sue.give_raise(.1) print(sue) print('-'*20) tom = Manager('Tom Jones', 'mgr', 50000) tom.give_raise(.1) print(tom.last_name()) print(tom) print('--All three--') for obj in (bob, sue, tom): obj.give_raise(.1) print(obj)這個示例定義了Person類,并且Person類的構造函數采用了默認關鍵字參數,重載了__str__方法用以print輸出,定義了得到last_name的方法,定義了give_raise漲工資方法。類Manager繼承自Person,Manager重新定義了自己的give_raise方法,獲得額外的bonus=0.1的獎金。
在代碼最后,寫了自測試的代碼if __name__ == '__main__',用以測試。輸出如下:
[Person: Bob Smith, 0]
[Person: Sue Jones, 100000]
Smith Jones
total percent:0.100000
[Person: Sue Jones, 110000]
--------------------
total percent:0.200000
Jones
[Person: Tom Jones, 60000]
--All three--
total percent:0.100000
[Person: Bob Smith, 0]
total percent:0.100000
[Person: Sue Jones, 121000]
total percent:0.200000
[Person: Tom Jones, 72000]
這里也可以給Manager增加自己獨有的方法。
定制構造函數
現在的代碼可以正常工作,但是,如果仔細研究會發現,當我們創建Manager對象的時候,必須為它提供一個mgr工作名稱似乎沒有意義:這已經由類自身暗示了。
新聞熱點
疑難解答