Python 面向對象(二)
阿新 • • 發佈:2018-06-11
調用方法 display 強制 attr span int got AI dead
類 ==> 實例化 ==> 實例對象
__init__ 構造函數
self.name = name # 屬性, 成員變量
def sayhi() # 方法, 動態屬性
def get_heart(self):
return self.__heart # 提供對外訪問接口, 但是外部只能獲取其值,不能改變其值.
屬性
- 公有屬性
- 當所有屬於本類的對象都能訪問的屬性稱為公有屬性(即全局屬性, 在類中定義的, 而不是在某一個方法<包括構造方法>中定義的 ? 不對吧, java中全局變量也可以私有化的, 只是看有沒有private修飾而已).
- 私有屬性
- __private_attr_name = value
- 強制訪問私有屬性方法: 實例對象_類名__屬性名
#!/usr/bin/python # -*- coding: utf-8 -*- class Role(object): nationality = "JP" def __init__(self, name, role, weapon, life_value=100, money=15000): self.name = name self.role = role self.weapon = weapon self.life_value = life_value #類公有屬性 self.money = money self.__heart = "Normal" # 私有屬性, 對外不可見(相當於java的private) def shot(self): print("%s is shooting" % self.name) self.__heart = "Dead" print(self.__heart) # 私有屬性可以內部訪問 def get_heart(self): return self.__heart # 提供對外訪問接口, 但是外部只能獲取其值,不能改變其值.def got_shot(self): print("ah... i got shot...") def buy_gun(self, gun_name): print("just bought %s" % gun_name) self.weapon = gun_name # 這樣如果買了什麽新武器, 也會同步更新屬性weapon的值 r1 = Role(‘Alex‘, ‘police‘, ‘AK47‘) # 生成一個角色 r2 = Role(‘Jack‘, ‘terrorist‘, ‘B22‘) # 生成一個角色 r1.shot() r2.buy_gun(‘AK47‘) print(r2.weapon) # 在buy_gun()方法中添加self.weapon = gun_name, 這樣若購買了新的武器, 就能更新屬性weapon的值 # print(r1.get_heart()) print(r1._Role__heart) # 外部強行訪問一個私有屬性 # 更改類的公有屬性有兩種方法 Role.nationality = "US" # 方法1. 所有對象的nationality值都會被更改. r1.natiocnality = "Thailand" # 方法2. 只有對象r1的nationality值會被更改. def shot2(self): # 在類中, 直接調用方法, 會自動把實例對象傳入方法. 在類外面的方法, 需要自己把實例傳入方法. print("my own shot method") r1.shot = shot2 r1.shot(r1) # 調用的其實是shot2()方法. 因方法shot2()不在類中, 所以需要自己把參數傳入.
面向對象的特性
- 封裝
- 對象和類概念的主要特性
- 把客觀事物封裝成抽象的類, 並且類可以把自己的數據和方法只讓可信的類或對象操作, 對不可信的進行信息屏蔽.
- 繼承
- 可以使用現在類的所有功能, 並在無需重新編寫原來類的情況下對這些功能進行擴展.
- 通過繼承創建的新類稱為"子類"或"派生類".
- 被繼承的類稱為"基類". "父類"或"超類".
- 繼承的過程, 就是從一般到特殊的過程.
Python 面向對象(二)