標籤:mon func sof 複製 析構 成員變數 屬性 16px 對象
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017/11/21 18:48
# @Author : mixiu26
class Role(object):
n=123 # 類變數
def __init__(self,name,role,weapon,life_value = 100,money = 15000):
# 類執行前先執行__init()__方法
# __init__() ----- >> 資料初始化:用於資料初始化賦值 self --- >> 相當於java中的this . this.name = name的意思,誰調用構造,self就相當於是誰
# ----- >> 建構函式
# ----- >> 在建立對象時完成資料初始化.
self.name = name # ---- >> 成員變數 ---- >> 靜態屬性
self.role = role
self.weapon = weapon
# self.life_value = life_value
self.__life_value = life_value # 將成員變數設定為私人屬性,對外提供公用存取方法,在變數前加上雙底線即可
self.money = money
def shot(self): # ----- >> 類的方法 ---- >> 動態屬性
print("shotting..........")
def __got_shot(self): # 成員方法私人,對外提供公用存取方法function()
# 在本類中可修改私人成員屬性值
self.__life_value -= 20
print("%s 被打中了....." %self.name)
def buy_gun(self,gun_name):
print("%s just bought %s" %(self.name, gun_name))
# 對外提供公用存取方法
def show(self):
print("%s生命值僅剩: %s" % (self.name,self.__life_value))
def function(self):
self.__got_shot()
# 解構函式 ---- >> 在執行個體釋放,準備銷毀時候執行,通常用於一些收尾處理,關閉記憶體空間,關閉資料庫連接,關閉開啟的臨時檔案
# 格式: def __del__(self):
# def __del__(self): # 執行個體釋放時自動執行,不接收任何參數:
# print("%s 執行個體釋放: " % self.name)
r1 = Role(‘mixiu26‘,‘police‘,‘AK46‘) # 建立角色 ---- >> 執行個體化 ---- >> 初始化類 ---- >> 建立對象
# # 執行個體化: ---- >> 把一個類變成一個具體對象的過程,稱為執行個體化
r2 = Role(‘hzh31‘,‘terrorlist‘,‘B22‘) # ---- >> 執行個體變數,範圍是執行個體本身 --- >>Role的執行個體
# r1.buy_gun(‘AK46‘)
# r2.buy_gun(‘B22‘)
# r1.got_shot() AttributeError: ‘Role‘ object has no attribute ‘got_shot‘
# r2.got_shot() AttributeError: ‘Role‘ object has no attribute ‘got_shot‘
r1.function()
r2.function()
r1.show()
r2.show()
# print(r1.self.__life_value) AttributeError: ‘Role‘ object has no attribute ‘self‘
# ---- >> 其實就相當於在棧中申請了空間,其實相當於在__iniy()__方法中申請了空間 r2, 然後Role(),其實就是相當與在堆記憶體開闢了一個空間
# ---- >> Role就相當於對資料進行初始化,name = null ,role = null,weapon = null, 其實還有方法區的初始化,然後Role中的方法區就有一個記憶體位址
# ---- >> Role()時就把Role中方法區的地址給了Role(), 然後就在二者間產生了關聯,所以將來這裡產生的對象就能通過這個地址值去找到Role中的成員方法
# ---- >> 這之後Role()方法的初始化就完成了,完成後Role()方法本身也獲得了一個地址值,然後就把這個地址值給了r1,r1就通過這個地址值指向了Role()
# ---- >> 那self呢?其實Role() 他自己就是self,整個Role()對象就是this,所以這次訪問的對象是r1,那麼self就相當於r1了
# ---- >> r1.buy_gun(),就會找到方法區中的buy_gun()方法,有就不報錯,然後把方法載入到棧記憶體,而我們現在是通過r1來調用,所以
# ---- >> 此刻的self代表的就是r1 ,所以在__inin()__ 方法中self.name = name ---- >>就相當於是r1.name = name,所以就相當於把
# ---- >> r1中的‘mixiu26‘給了name, 把police給了role
# print(r1.n,r1.name) # 123 mixiu26
# print(r2.n,r2.name) # 123 hzh31
#
# # 修改變數值:
# r1.name = "neinei"
# r2.name = "paofu"
#
# print(r1.n,r1.name) # 123 neinei
# print(r2.n,r2.name) # 123 paofu
# 為r1添加屬性值:
# r1.dream = "good girl"
# print(r1.n,r1.name,r1.dream) # 123 neinei good girl ==== >> 其實這裡有隱含的(r1,r1.n,r1.name,r1.dream)
#
# # 刪除成員屬性值:
# del r1.dream
# # print(r1.n,r1.name,r1.dream) # AttributeError: ‘Role‘ object has no attribute ‘dream‘
#
# # 修改類變數的值:
# r1.n = "789"
# print(r1.n,r1.name) # 789 neinei 注意,這裡說的修改類變數的值,其實是把n= xxx複製到了執行個體變數中, 然後執行個體變數再去修改n時,其實這個n和類變數的n已經
# # 不是同一個n了,所以我們在怎麼修改n都是修改執行個體變數裡的,和成員變數n是沒有關係的,所以看到的結果是,r1列印了修改後的值,r2中還是成員變數值
# print(r2.n,r2.name) # 123 paofu
# 修改成員變數n: 注意,變數的讀取遵循就近原則,在前面過程中,我們調用執行個體變數r1修改成員變數n,我們知道他的原理是把n=xxx,複製了一份到執行個體變數r1中
# 所以當Role在取修改n的值時,r1是不會受影響的,因為它讀取的是自己執行個體變數中的n,你成員變數的n在怎麼變,對我執行個體變數來說都沒有任何影響,而r2中沒有這個執行個體變數
# 所以讀取的還是成員變數中的n,所以當成員變數的值發生改變後,r2.n 也發生了改變
# Role.n = "ABC"
# print(r1.n,r1.name) # 789 neinei
# # del r1 # neinei 執行個體釋放: 變數消失時會自動執行解構函式回收記憶體空間,對象不消失,則會等到程式執行完成退出時,回收所有記憶體空間時執行這個方法
# print(r2.n,r2.name) # ABC paofu
# 類變數 --- >> 公有屬性,節省記憶體空間
# 建構函式 --- >> 建立對象時完成資料初始化:
python『學習之路03』物件導向