国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python面向對象編程中關于類和方法的學習筆記

2019-11-25 16:40:31
字體:
來源:轉載
供稿:網友

類和實例
python是一個面向對象的語言,而面向對象最重要的概念就是類和實例, 記得剛學習的時候不太理解這些概念,直到老師說了一句”物以類聚”. 沒錯就是類, 歸類

物以類聚

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

class Person(object):  pass

我們定義了人這個類, 但人有一些特性,比如 兩個眼睛,一個嘴巴, 我們把這些添加進去

class Person(object):  eyes = 2  mouth = 1

已經把人的一些信息寫進去了,但是人還有名字, 比如我mink. 好吧我不能虧待自己我得把這些添加進去

class Person(object):  eyes = 2  mouth = 1  name = mink

太完美了,一個人終于完成了. 上帝用了一天我就用了一分鐘(開個玩笑), 我們讀一下信息. 人類他有兩個眼睛,一個嘴巴,還有名字叫mink. - -! 有點不對,mink是我的名字啊~ 怎么人類叫mink呢
mink是人類的名字, 人類的名字是mink顯然是錯誤的, “wo” 應該是人類的個體,是個單個例子

class Person(object):  eyes = 2  mouth = 1    def __init__(self, name):    self.name = name me = Person('mink')

現在我終于有了自己的名字而不是給大家共用, 這個方法叫實例但是我有一個別人不會的技能, 我不受重力影響.

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("我不受重力影響, 我會飛")

類方法和靜態方法
python中可以經常看到@classmethod和@staticmethod, 被稱為類方法和實例方法.

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

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

# 顯示內容是一樣的print cat.name, cat.ageprint Animal.name, Animal.age給Animal類添加一個方法(函數)class Animal(object):  name = 'lili'  age = 1  def edit(self, name, age):    self.name = name    self.age = agecat = Animal()cat.edit('rol', 2)print cat.name, cat.age     # print 'rol' 2print Animal.name, Animal.age  # print 'lili' 1

也就是說這個默認添加的方法是一個實例的方法, 實例方法修改了實例的屬性,而類的屬性不改變

# 我們修改一下這個函數def edit(self, name, age):  name = name  self.age = agecat = Animal()cat.edit('rol', 2)print cat.name, cat.age     # pirnt 'rol' 2print Animal.name, cat.age   # print 'lili' 1

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

# 再一次修改edit@classmethoddef edit(cls, name, age):  cls.name = name  cls.age = agecat = Animal()cat.edit('rol', 2)print cat.name, cat.age     # print 'rol' 2print Animal.name, Animal.age  # print 'rol' 2

這里需要注意的是edit函數的第一個參數有self變為cls, python中建議大家在類的方法中使用cls而實例方法的參數為self, 而且這里說明了實例可以使用類的方法(函數)
那么我在給這個類添加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' 4print Animal.name, Animal.age  # print 'rol' 2

添加__init__以后, cat不再使用類的屬性,而修改了edit方法也沒有改變cat實例的屬性.

# 添加staticmethod@staticmethoddef say_name(name=None):  if not name:    name = self.name  print 'my name is %s.' % namecat = 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), 顯示缺少參數

這說明staticmethod 不能使用實例的屬性和方法, 當然也使用不了類. 那么反過來呢

# 我們修改一下代碼# 先創建一個實例的方法, 他使用類的staticmethod@staticmethoddef say_name(name):  print 'my name is %s.' % namedef say(self):  self.say_name(self.name)  @classmethoddef _say(cls):  cls.say_name(cls.name)cat = Animal('kaka', 3)cat.say()cat._say()

可以通過類方法和實例方法訪問staticmethod.
總結一下:
靜態方法(staticmethod)

  • 靜態方法不能使用實例的屬性和方法
  • 靜態方法不能使用類的屬性和方法
  • 靜態方法可以通過類或實例調用
  • 靜態方法等于作用域在類中的全局函數

類方法(classmethod)

  • 類方法可以使用類的屬性和方法
  • 類的方法可以使用靜態方法
  • 類的方法可以通過類或實例調用

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 正宁县| 远安县| 历史| 镇宁| 搜索| 林甸县| 佛教| 芦溪县| 清远市| 和林格尔县| 屏东市| 登封市| 岫岩| 中山市| 驻马店市| 临洮县| 开平市| 连云港市| 平阴县| 嘉峪关市| 沅江市| 抚松县| 从江县| 大洼县| 大丰市| 云阳县| 漳浦县| 迁西县| 许昌市| 凌云县| 永宁县| 阳原县| 阳曲县| 社会| 东乡县| 赫章县| 玛多县| 策勒县| 娄烦县| 仁怀市| 武胜县|