Python面向?qū)ο缶幊讨嘘P(guān)于類和方法的學(xué)習(xí)筆記
類和實例
python是一個面向?qū)ο蟮恼Z言,而面向?qū)ο笞钪匾母拍罹褪穷惡蛯嵗? 記得剛學(xué)習(xí)的時候不太理解這些概念,直到老師說了一句”物以類聚”. 沒錯就是類, 歸類
物以類聚
類其實就是把一些相同特性的事物歸成一類, 比如人
class Person(object): pass
我們定義了人這個類, 但人有一些特性,比如 兩個眼睛,一個嘴巴, 我們把這些添加進(jìn)去
class Person(object): eyes = 2 mouth = 1
已經(jīng)把人的一些信息寫進(jìn)去了,但是人還有名字, 比如我mink. 好吧我不能虧待自己我得把這些添加進(jìn)去
class Person(object): eyes = 2 mouth = 1 name = mink
太完美了,一個人終于完成了. 上帝用了一天我就用了一分鐘(開個玩笑), 我們讀一下信息. 人類他有兩個眼睛,一個嘴巴,還有名字叫mink. - -! 有點不對,mink是我的名字啊~ 怎么人類叫mink呢
mink是人類的名字, 人類的名字是mink顯然是錯誤的, “wo” 應(yīng)該是人類的個體,是個單個例子
class Person(object): eyes = 2 mouth = 1 def __init__(self, name): self.name = name me = Person('mink')
現(xiàn)在我終于有了自己的名字而不是給大家共用, 這個方法叫實例但是我有一個別人不會的技能, 我不受重力影響.
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("我不受重力影響, 我會飛")
類方法和靜態(tài)方法
python中可以經(jīng)??吹紷classmethod和@staticmethod, 被稱為類方法和實例方法.
class Animal(object): name = 'lili' age = 1 cat = Animal() print cat.name, cat.age # print 'lili' 1
創(chuàng)建了一個動物類, 生成了一個cat的實例, 打印cat的名字和年齡, 可以看出返回的是Animal這個類的屬性, 也就是實例訪問了類的屬性
# 顯示內(nèi)容是一樣的 print cat.name, cat.age print Animal.name, Animal.age 給Animal類添加一個方法(函數(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
也就是說這個默認(rèn)添加的方法是一個實例的方法, 實例方法修改了實例的屬性,而類的屬性不改變
# 我們修改一下這個函數(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
說明實例方法不能修改類的屬性, 但我想修改類的屬性怎么辦
# 再一次修改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ù)的第一個參數(shù)有self變?yōu)閏ls, python中建議大家在類的方法中使用cls而實例方法的參數(shù)為self, 而且這里說明了實例可以使用類的方法(函數(shù))
那么我在給這個類添加init方法來初始化屬性
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不再使用類的屬性,而修改了edit方法也沒有改變cat實例的屬性.
# 添加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() # 運行的話會報 NameError: global name 'self' is not defined # 那是不是沒給他添加self字段, 所以沒找到 def say_name(self, name=None): ... cat.say_name() # TypeError: say_name() takes at least 1 argument(0 given), 顯示缺少參數(shù)
這說明staticmethod 不能使用實例的屬性和方法, 當(dāng)然也使用不了類. 那么反過來呢
# 我們修改一下代碼 # 先創(chuàng)建一個實例的方法, 他使用類的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()
可以通過類方法和實例方法訪問staticmethod.
總結(jié)一下:
靜態(tài)方法(staticmethod)
- 靜態(tài)方法不能使用實例的屬性和方法
- 靜態(tài)方法不能使用類的屬性和方法
- 靜態(tài)方法可以通過類或?qū)嵗{(diào)用
- 靜態(tài)方法等于作用域在類中的全局函數(shù)
類方法(classmethod)
- 類方法可以使用類的屬性和方法
- 類的方法可以使用靜態(tài)方法
- 類的方法可以通過類或?qū)嵗{(diào)用
相關(guān)文章
python+tkinter實現(xiàn)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python+tkinter實現(xiàn)學(xué)生管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-08-08使用Python的開發(fā)框架Brownie部署以太坊智能合約
在本文中,我們將使用Python部署智能合約。這篇文章可能是您走向智能合約和區(qū)塊鏈開發(fā)的橋梁!2021-05-05TensorFlow Session使用的兩種方法小結(jié)
今天小編就為大家分享一篇TensorFlow Session使用的兩種方法小結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07PythonPC客戶端自動化實現(xiàn)原理(pywinauto)
這篇文章主要介紹了Python基于pywinauto實現(xiàn)PC客戶端自動化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-05-05python基礎(chǔ)之變量和數(shù)據(jù)類型
這篇文章主要介紹了python的變量和數(shù)據(jù)類型,實例分析了Python中返回一個返回值與多個返回值的方法,需要的朋友可以參考下2021-10-10pytorch 中autograd.grad()函數(shù)的用法說明
這篇文章主要介紹了pytorch 中autograd.grad()函數(shù)的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05基于Python制作一個端午節(jié)相關(guān)的小游戲
端午節(jié)快樂,今天我將為大家?guī)硪黄嘘P(guān)端午節(jié)的編程文章,希望能夠為大家獻(xiàn)上一份小小的驚喜,我們將會使用Python來實現(xiàn)一個與端午粽子相關(guān)的小應(yīng)用程序,在本文中,我將會介紹如何用Python代碼制做一個“粽子拆解器”,感興趣的小伙伴歡迎閱讀2023-06-06