Python面向?qū)ο缶幊讨嘘P(guān)于類(lèi)和方法的學(xué)習(xí)筆記
類(lèi)和實(shí)例
python是一個(gè)面向?qū)ο蟮恼Z(yǔ)言,而面向?qū)ο笞钪匾母拍罹褪穷?lèi)和實(shí)例, 記得剛學(xué)習(xí)的時(shí)候不太理解這些概念,直到老師說(shuō)了一句”物以類(lèi)聚”. 沒(méi)錯(cuò)就是類(lèi), 歸類(lèi)
物以類(lèi)聚
類(lèi)其實(shí)就是把一些相同特性的事物歸成一類(lèi), 比如人
class Person(object): pass
我們定義了人這個(gè)類(lèi), 但人有一些特性,比如 兩個(gè)眼睛,一個(gè)嘴巴, 我們把這些添加進(jìn)去
class Person(object): eyes = 2 mouth = 1
已經(jīng)把人的一些信息寫(xiě)進(jìn)去了,但是人還有名字, 比如我mink. 好吧我不能虧待自己我得把這些添加進(jìn)去
class Person(object): eyes = 2 mouth = 1 name = mink
太完美了,一個(gè)人終于完成了. 上帝用了一天我就用了一分鐘(開(kāi)個(gè)玩笑), 我們讀一下信息. 人類(lèi)他有兩個(gè)眼睛,一個(gè)嘴巴,還有名字叫mink. - -! 有點(diǎn)不對(duì),mink是我的名字啊~ 怎么人類(lèi)叫mink呢
mink是人類(lèi)的名字, 人類(lèi)的名字是mink顯然是錯(cuò)誤的, “wo” 應(yīng)該是人類(lèi)的個(gè)體,是個(gè)單個(gè)例子
class Person(object):
eyes = 2
mouth = 1
def __init__(self, name):
self.name = name
me = Person('mink')
現(xiàn)在我終于有了自己的名字而不是給大家共用, 這個(gè)方法叫實(shí)例但是我有一個(gè)別人不會(huì)的技能, 我不受重力影響.
class Person(object):
eyes = 2
mouth = 1
def __init__(self, name)
self.name = name
def jineng(self, txt):
print "%s %s" % (self.name, txt)
me = Person('mink')
me.jineng("我不受重力影響, 我會(huì)飛")
類(lèi)方法和靜態(tài)方法
python中可以經(jīng)??吹紷classmethod和@staticmethod, 被稱(chēng)為類(lèi)方法和實(shí)例方法.
class Animal(object): name = 'lili' age = 1 cat = Animal() print cat.name, cat.age # print 'lili' 1
創(chuàng)建了一個(gè)動(dòng)物類(lèi), 生成了一個(gè)cat的實(shí)例, 打印cat的名字和年齡, 可以看出返回的是Animal這個(gè)類(lèi)的屬性, 也就是實(shí)例訪(fǎng)問(wèn)了類(lèi)的屬性
# 顯示內(nèi)容是一樣的
print cat.name, cat.age
print Animal.name, Animal.age
給Animal類(lèi)添加一個(gè)方法(函數(shù))
class Animal(object):
name = 'lili'
age = 1
def edit(self, name, age):
self.name = name
self.age = age
cat = Animal()
cat.edit('rol', 2)
print cat.name, cat.age # print 'rol' 2
print Animal.name, Animal.age # print 'lili' 1
也就是說(shuō)這個(gè)默認(rèn)添加的方法是一個(gè)實(shí)例的方法, 實(shí)例方法修改了實(shí)例的屬性,而類(lèi)的屬性不改變
# 我們修改一下這個(gè)函數(shù)
def edit(self, name, age):
name = name
self.age = age
cat = Animal()
cat.edit('rol', 2)
print cat.name, cat.age # pirnt 'rol' 2
print Animal.name, cat.age # print 'lili' 1
說(shuō)明實(shí)例方法不能修改類(lèi)的屬性, 但我想修改類(lèi)的屬性怎么辦
# 再一次修改edit
@classmethod
def edit(cls, name, age):
cls.name = name
cls.age = age
cat = Animal()
cat.edit('rol', 2)
print cat.name, cat.age # print 'rol' 2
print Animal.name, Animal.age # print 'rol' 2
這里需要注意的是edit函數(shù)的第一個(gè)參數(shù)有self變?yōu)閏ls, python中建議大家在類(lèi)的方法中使用cls而實(shí)例方法的參數(shù)為self, 而且這里說(shuō)明了實(shí)例可以使用類(lèi)的方法(函數(shù))
那么我在給這個(gè)類(lèi)添加init方法來(lái)初始化屬性
class Animal(object):
name = 'lili'
age = 1
def __init__(self, name, age):
self.name = name
self.age = age
...
cat = Animal('kuku', 4)
cat.edit('rol', 2)
print cat.name, cat.age # print 'kuku' 4
print Animal.name, Animal.age # print 'rol' 2
添加__init__以后, cat不再使用類(lèi)的屬性,而修改了edit方法也沒(méi)有改變cat實(shí)例的屬性.
# 添加staticmethod
@staticmethod
def say_name(name=None):
if not name:
name = self.name
print 'my name is %s.' % name
cat = Animal('kaka', 3)
cat.say_name()
# 運(yùn)行的話(huà)會(huì)報(bào) NameError: global name 'self' is not defined
# 那是不是沒(méi)給他添加self字段, 所以沒(méi)找到
def say_name(self, name=None):
...
cat.say_name()
# TypeError: say_name() takes at least 1 argument(0 given), 顯示缺少參數(shù)
這說(shuō)明staticmethod 不能使用實(shí)例的屬性和方法, 當(dāng)然也使用不了類(lèi). 那么反過(guò)來(lái)呢
# 我們修改一下代碼
# 先創(chuàng)建一個(gè)實(shí)例的方法, 他使用類(lèi)的staticmethod
@staticmethod
def say_name(name):
print 'my name is %s.' % name
def say(self):
self.say_name(self.name)
@classmethod
def _say(cls):
cls.say_name(cls.name)
cat = Animal('kaka', 3)
cat.say()
cat._say()
可以通過(guò)類(lèi)方法和實(shí)例方法訪(fǎng)問(wèn)staticmethod.
總結(jié)一下:
靜態(tài)方法(staticmethod)
- 靜態(tài)方法不能使用實(shí)例的屬性和方法
- 靜態(tài)方法不能使用類(lèi)的屬性和方法
- 靜態(tài)方法可以通過(guò)類(lèi)或?qū)嵗{(diào)用
- 靜態(tài)方法等于作用域在類(lèi)中的全局函數(shù)
類(lèi)方法(classmethod)
- 類(lèi)方法可以使用類(lèi)的屬性和方法
- 類(lèi)的方法可以使用靜態(tài)方法
- 類(lèi)的方法可以通過(guò)類(lèi)或?qū)嵗{(diào)用
相關(guān)文章
pymysql 插入數(shù)據(jù) 轉(zhuǎn)義處理方式
今天小編就為大家分享一篇pymysql 插入數(shù)據(jù) 轉(zhuǎn)義處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
在Python中利用Pandas庫(kù)處理大數(shù)據(jù)的簡(jiǎn)單介紹
這篇文章簡(jiǎn)單介紹了在Python中利用Pandas處理大數(shù)據(jù)的過(guò)程,Pandas庫(kù)的使用能夠很好地展現(xiàn)數(shù)據(jù)結(jié)構(gòu),是近來(lái)Python項(xiàng)目中經(jīng)常被使用使用的熱門(mén)技術(shù),需要的朋友可以參考下2015-04-04
python實(shí)現(xiàn)數(shù)據(jù)挖掘中分箱的示例代碼
數(shù)據(jù)分箱(英語(yǔ):Data?binning)是一種數(shù)據(jù)預(yù)處理方法,用于最大限度地減少小觀(guān)測(cè)誤差的影響,本文主要為大家介紹了python實(shí)現(xiàn)數(shù)據(jù)分箱的相關(guān)知識(shí),感興趣的可以了解下2024-01-01
aws 通過(guò)boto3 python腳本打pach的實(shí)現(xiàn)方法
這篇文章主要介紹了aws 通過(guò)boto3 python腳本打pach的實(shí)現(xiàn)方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
一篇文章弄懂Python中所有數(shù)組數(shù)據(jù)類(lèi)型
這篇文章主要給大家介紹了關(guān)于Python中所有數(shù)組數(shù)據(jù)類(lèi)型的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
django之使用celery-把耗時(shí)程序放到celery里面執(zhí)行的方法
今天小編就為大家分享一篇django之使用celery-把耗時(shí)程序放到celery里面執(zhí)行的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07

