欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python面向?qū)ο缶幊讨嘘P(guān)于類和方法的學(xué)習(xí)筆記

 更新時(shí)間:2016年06月30日 18:56:49   作者:cangmean  
類與類方法是面向?qū)ο蟮木幊陶Z言中必不可少的特性,本文總結(jié)了Python面向?qū)ο缶幊讨嘘P(guān)于類和方法的學(xué)習(xí)筆記,需要的朋友可以參考下

類和實(shí)例
python是一個(gè)面向?qū)ο蟮恼Z言,而面向?qū)ο笞钪匾母拍罹褪穷惡蛯?shí)例, 記得剛學(xué)習(xí)的時(shí)候不太理解這些概念,直到老師說了一句”物以類聚”. 沒錯就是類, 歸類

物以類聚

類其實(shí)就是把一些相同特性的事物歸成一類, 比如人

class Person(object):
  pass

我們定義了人這個(gè)類, 但人有一些特性,比如 兩個(gè)眼睛,一個(gè)嘴巴, 我們把這些添加進(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

太完美了,一個(gè)人終于完成了. 上帝用了一天我就用了一分鐘(開個(gè)玩笑), 我們讀一下信息. 人類他有兩個(gè)眼睛,一個(gè)嘴巴,還有名字叫mink. - -! 有點(diǎn)不對,mink是我的名字啊~ 怎么人類叫mink呢
mink是人類的名字, 人類的名字是mink顯然是錯誤的, “wo” 應(yīng)該是人類的個(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è)別人不會的技能, 我不受重力影響.

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, 被稱為類方法和實(shí)例方法.

class Animal(object):
  name = 'lili'
  age = 1

cat = Animal()
print cat.name, cat.age   # print 'lili' 1

創(chuàng)建了一個(gè)動物類, 生成了一個(gè)cat的實(shí)例, 打印cat的名字和年齡, 可以看出返回的是Animal這個(gè)類的屬性, 也就是實(shí)例訪問了類的屬性

# 顯示內(nèi)容是一樣的
print cat.name, cat.age
print Animal.name, Animal.age
給Animal類添加一個(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

也就是說這個(gè)默認(rèn)添加的方法是一個(gè)實(shí)例的方法, 實(shí)例方法修改了實(shí)例的屬性,而類的屬性不改變

# 我們修改一下這個(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

說明實(shí)例方法不能修改類的屬性, 但我想修改類的屬性怎么辦

# 再一次修改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中建議大家在類的方法中使用cls而實(shí)例方法的參數(shù)為self, 而且這里說明了實(shí)例可以使用類的方法(函數(shù))
那么我在給這個(gè)類添加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實(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)行的話會報(bào) 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 不能使用實(shí)例的屬性和方法, 當(dāng)然也使用不了類. 那么反過來呢

# 我們修改一下代碼
# 先創(chuàng)建一個(gè)實(shí)例的方法, 他使用類的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()

可以通過類方法和實(shí)例方法訪問staticmethod.
總結(jié)一下:
靜態(tài)方法(staticmethod)

  • 靜態(tài)方法不能使用實(shí)例的屬性和方法
  • 靜態(tài)方法不能使用類的屬性和方法
  • 靜態(tài)方法可以通過類或?qū)嵗{(diào)用
  • 靜態(tài)方法等于作用域在類中的全局函數(shù)

類方法(classmethod)

  • 類方法可以使用類的屬性和方法
  • 類的方法可以使用靜態(tài)方法
  • 類的方法可以通過類或?qū)嵗{(diào)用

相關(guān)文章

  • Python常用模塊os.path之文件及路徑操作方法

    Python常用模塊os.path之文件及路徑操作方法

    os.path 模塊主要用于獲取文件的屬性。這篇文章主要介紹了Python常用模塊os.path——文件及路徑操作,需要的朋友可以參考下
    2019-12-12
  • python+tkinter實(shí)現(xiàn)學(xué)生管理系統(tǒng)

    python+tkinter實(shí)現(xiàn)學(xué)生管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了python+tkinter實(shí)現(xiàn)學(xué)生管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 詳解解決jupyter不能使用pytorch的問題

    詳解解決jupyter不能使用pytorch的問題

    這篇文章主要介紹了詳解解決jupyter不能使用pytorch的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 使用Python的開發(fā)框架Brownie部署以太坊智能合約

    使用Python的開發(fā)框架Brownie部署以太坊智能合約

    在本文中,我們將使用Python部署智能合約。這篇文章可能是您走向智能合約和區(qū)塊鏈開發(fā)的橋梁!
    2021-05-05
  • TensorFlow Session使用的兩種方法小結(jié)

    TensorFlow Session使用的兩種方法小結(jié)

    今天小編就為大家分享一篇TensorFlow Session使用的兩種方法小結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • PythonPC客戶端自動化實(shí)現(xiàn)原理(pywinauto)

    PythonPC客戶端自動化實(shí)現(xiàn)原理(pywinauto)

    這篇文章主要介紹了Python基于pywinauto實(shí)現(xiàn)PC客戶端自動化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • python基礎(chǔ)之變量和數(shù)據(jù)類型

    python基礎(chǔ)之變量和數(shù)據(jù)類型

    這篇文章主要介紹了python的變量和數(shù)據(jù)類型,實(shí)例分析了Python中返回一個(gè)返回值與多個(gè)返回值的方法,需要的朋友可以參考下
    2021-10-10
  • pytorch 中autograd.grad()函數(shù)的用法說明

    pytorch 中autograd.grad()函數(shù)的用法說明

    這篇文章主要介紹了pytorch 中autograd.grad()函數(shù)的用法說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • 520必備!這些Python表白代碼祝你脫單成功

    520必備!這些Python表白代碼祝你脫單成功

    不會還有程序猿沒有女朋友吧?沒關(guān)系,今天特地為大家整理了這些Python花式表白代碼,你就放心大膽的去吧,需要的朋友可以參考下
    2021-05-05
  • 基于Python制作一個(gè)端午節(jié)相關(guān)的小游戲

    基于Python制作一個(gè)端午節(jié)相關(guān)的小游戲

    端午節(jié)快樂,今天我將為大家?guī)硪黄嘘P(guān)端午節(jié)的編程文章,希望能夠?yàn)榇蠹耀I(xiàn)上一份小小的驚喜,我們將會使用Python來實(shí)現(xiàn)一個(gè)與端午粽子相關(guān)的小應(yīng)用程序,在本文中,我將會介紹如何用Python代碼制做一個(gè)“粽子拆解器”,感興趣的小伙伴歡迎閱讀
    2023-06-06

最新評論