【python】class之类的定义
Class 類
一個類即是對一類擁有相同屬性的對象的抽象、藍圖、原型。在類中定義了這些對象的都具備的屬性(variables(data))、共同的方法
Object 對象
一個對象即是一個類的實例化后實例,一個類必須經過實例化后方可在程序中調用,一個類可以實例化多個對象,每個對象亦可以有不同的屬性。
Encapsulation 封裝
在類中對數據的賦值、內部調用對外部用戶是透明的,這使類變成了一個膠囊或容器,里面包含著類的數據和方法
Inheritance 繼承
一個類可以派生出子類,在這個父類里定義的屬性、方法自動被子類繼承
Polymorphism 多態
多態是面向對象的重要特性,簡單點說:“一個接口,多種實現”,指一個基類中派生出了不同的子類,且每個子類在繼承了同樣的方法名的同時又對父類的方法做了不同的實現,這就是同一種事物表現出的多種形態。
使用class定義類,可以提供一個可選的父類或者基類,如果沒有合適的基類,那就使用object作為基類,也可以不寫。新式類寫法:class FooClass (object);就舊式類寫法:
class Role(object): #定義一個類, class是定義類的語法,Role是類名,(object)是新式類的寫法
def __init__(self,name,role,weapon,life_value=100,money=15000):
#當一個類實例化時,_init_()方法會自動執行,該方法目的是對實例初始化工作。
# 同樣通過創建自己的_init_()方法,可以覆蓋默認的_init_()方法
self.name = name #__init__中的第一個參數self,和這里的self都 是什么意思? 看下面解釋
self.role = role
self.weapon = weapon
self.life_value = life_value
self.money = money def shot(self,name):
print("shooting...%s"%name) def got_shot(self):
print("ah...,I got shot...") def buy_gun(self, gun_name):
print("just bought %s" % gun_name) def __del__(self): ##析構函數
print("it is over") r1 = Role('Alex', 'police', 'AK47')
#生成一個角色,Role('Alex', 'police', 'AK47')為實例化的對象地址,把對象地址傳給r1
#也可以通過Role('Alex', 'police', 'AK47').shot('paul')調用
r1.shot("paul")
#>>>shooting...paul r2 = Role('Jack', 'terrorist', 'B22') #生成一個角色,此時self 相當于 r2 , Role(r1,'Alex','police','AK47’)
r2.got_shot()
#>>>ah...,I got shot...
上面的這個__init__()叫做初始化方法(或構造方法), 在類被調用時,這個方法(雖然它是函數形式,但在類中就不叫函數了,叫方法)會自動執行,進行一些初始化的動作。__del__為析構函數,在實例釋放,銷毀時候被執行,常用語一些收尾工作,比如關閉數據庫連接或者打開臨時文件。我們這里寫的__init__(self,name,role,weapon,life_value=100,money=15000)就是要在創建一個角色時給它設置這些屬性,那么這第一個參數self是干毛用的呢?
self為實例本身,用于關聯調用類的屬性和方法。
封裝,其實就是使用構造方法將內容封裝到某個具體對象中,然后通過對象直接或者self間接獲取被封裝的內容。
類屬性和實例屬性
- 類體中、所有函數之外:此范圍定義的變量,稱為類屬性或類變量;用于存儲實例共有的屬性,節省開銷
- 類體中,所以函數內部:以“self.變量名”的方式定義的變量,稱為實例屬性或實例變量;
- 類體中,所有函數內部:以“變量名=變量值”的方式定義的變量,稱為局部變量。
實例變量只能通過對象名訪問,無法通過類名訪問。
通過類名修改類變量,會作用到所有的實例化對象。通過類對象是無法修改類變量的。通過類對象對類變量賦值,其本質將不再是修改類變量的值,而是在給該對象定義新的實例變量
class Person(object):
county='CN'
def __init__(self,name,age):
self.name = name
self.role = age def shot(self,name):
print("shooting...%s"%name) def got_shot(self):
print("ah...,I got shot...") print(Person.county) ##獲取類變量
#>>>CN
P1=Person('PAUL','22')
print(P1.county) ##獲取類變量
#>>>CN
P1.county='HK' ##并不是修改類變量,通過類對象對類變量賦值,其本質將不再是修改類變量的值,而是在給該對象定義新的實例變量
print(P1.county) ##獲取新加的實例變量
#>>>HK
P2=Person('EVA','23')
print(P2.county) ##獲取類變量
#>>>CN
Person.county='US' ##通過類名修改類變量,會作用到所有的實例化對象
##類中,實例變量和類變量可以同名,但這種情況下使用類對象將無法調用類變量,它會首選實例變量,這也是不推薦“類變量使用對象名調用”的原因。
print(P1.county) ##獲取新加的實例變量
#>>>HK
print(P2.county) ##獲取類變量
#>>>US
P3=Person('kate','25')
print(P3.county)獲取類變量
#>>>US
值得一提的是:除了可以通過類名訪問類變量之外,還可以動態地為類和對象添加類變量
class Person(object):
county='CN'
def __init__(self,name,age):
self.name = name
self.role = age def shot(self,name):
print("shooting...%s"%name) def got_shot(self):
print("ah...,I got shot...") Person.job='IT'
P1=Person("PAUL",22)
print(P1.job)
#>>>IT
類方法和實例方法及靜態方法
類方法:在方法前面加上@classmethod 這樣的方法稱為類方法,最少也要包含一個參數,只不過類方法中通常將其命名為 cls。調用類方法時,無需顯式為 cls 參數傳參
類方法可以修改類屬性的值。類方法只能訪問類變量,不能訪問實例變量。
實例方法:帶有self的都是實例方法。
靜態方法:實際和類沒有關系了,靜態方法沒有類似 self、cls 這樣的特殊參數,類的靜態方法中無法調用任何類屬性和類方法。一般會完成和類對象也和實例對象沒有關聯的基本功能,如一些打印功能。
class Person(object):
county='CN'
def __init__(self,name,age):
self.name = name
self.role = age def got_shot(self):
print("ah...,I got shot...") @classmethod
def info(cls):
print("正在調用類方法") ##通過類方法修改類變量
Person.county='UK' @staticmethod
def msg(msg):
print('靜態方法調用 %s'%msg) #####實例方法
P1=Person("PAUL",22)
P1.got_shot()###類對象直接調用
#>>>ah...,I got shot..
Person.got_shot(P1)##類名調用實例方法,但此方式需要手動給 self 參數傳值
#>>>ah...,I got shot.. #####類方法
Person.info() ##使用類名直接調用類方法
#>>>正在調用類方法
P1.info()####使用類對象調用類方法
#>>>正在調用類方法
print(P1.county)
#>>>UK ####靜態方法
Person.msg('ok')##使用類名直接調用類方法
#>>>靜態方法調用 ok
P1.msg('ok')####使用類對象調用類方法
#>>>靜態方法調用 ok
私有方法和變量
無論是私有類變量和方法還是私有實例變量和方法,類外都不能直接訪問,只能在類內訪問。
class Person(object):
county='CN'
__salary=100
def __init__(self,name,role,age):
self.name = name
self.role = role
self.__age = age def got_shot(self):
print("ah...,I got shot...") def __msg(self):
print('這是私有實例方法') def get_salary(self):
print(self.__salary)
self.__msg() P1=Person("paul",'IT','22')
P1.get_salary()
#>>>100
#>>>這是私有實例方法
總結
以上是生活随笔為你收集整理的【python】class之类的定义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ceph笔记(一)
- 下一篇: 九霞彩带 RIBBON的单丝带在其他场合