首頁  >  文章  >  後端開發  >  Python物件導向程式設計中關於類別和方法

Python物件導向程式設計中關於類別和方法

高洛峰
高洛峰原創
2017-03-01 13:33:381356瀏覽

類別和實例

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 = 1

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

創建了一個動物類別, 產生了一個cat的實例, 印出cat的名字和年齡, 可以看出傳回的是Animal這個類別的屬性, 也就是實例存取了類別的屬性

# 显示内容是一样的
print cat.name, cat.age
print Animal.name, Animal.age
给Animal类添加一个方法(函数)

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

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

# 我们修改一下这个函数
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函數的第一個參數有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' 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), 显示缺少参数

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

# 我们修改一下代码
# 先创建一个实例的方法, 他使用类的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.
總結一下:
靜態方法(staticmethod)

靜態方法不能使用實例的屬性與方法

靜態方法不能使用類別的屬性與方法

靜態方法可以透過類別或實例呼叫

靜態方法等於作用域在類別中的全域函數

類別方法(classmethod)

類別方法可以使用類別的屬性和方法

類別的方法可以使用靜態方法

類別的方法可以透過類或實例呼叫


更多Python物件導向程式設計中關於類別和方法相關文章請關注PHP中文網!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn