1. 程式人生 > >Python 面向對象(二)

Python 面向對象(二)

調用方法 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 面向對象(二)