1. 程式人生 > 程式設計 >解析python 類方法、物件方法、靜態方法

解析python 類方法、物件方法、靜態方法

python中實現靜態方法和類方法都是依賴於python的修飾器來實現的。 物件方法有self引數,類方法有cls引數,靜態方法是不需要這些附加引數的。

1、我們已經討論了類/物件可以擁有像函式一樣的方法,這些物件方法與函式的區別只是一個額外的self變數

# -*- coding:utf-8 -*-
#!/usr/bin/python
# Filename: method.py

class Person:
grade=1
def __init__(self,name):
self.name = name
def sayHi(self):#加self區別於普通函式
print 'Hello,your name is?',self.name

@staticmethod #宣告靜態,去掉則編譯報錯;還有靜態方法不能訪問類變數和例項變數
def sayName():#使用了靜態方法,則不能再使用self
print "my name is king"#,grade,#self.name

@classmethod #類方法
def classMethod(cls):
print("class method")

p = Person("king")
p.sayHi()
p.sayName()
p.classMethod()
Person.classMethod()

輸出:

Hello,your name is? king
my name is king
class method
class method

2、靜態方法

要在類中使用靜態方法,需在類成員函式前面加上@staticmethod標記符,以表示下面的成員函式是靜態函式。使用靜態方法的好處是,不需要定義例項即可使用這個方法。另外,多個例項共享此靜態方法。

靜態方法是一類特殊的方法,有時可能需要寫一個屬於這個類的方法,但是這些程式碼完全不會使用到例項物件本身,例如:

class Student(object):
  @staticmethod
  def aver_age(x,y):
    return x + y

  def year(self):
    return self.aver_age(self.month,self.day)

這個例子中,如果把aver_age作為非靜態方法同樣可以執行,但是它要提供self引數,而這個引數在方法中根本不會被使用到。這裡的@staticmethod裝飾器可以給我們帶來一些好處,Python不再需要為Student物件例項初始化一個繫結方法,繫結方法同樣是物件,但是建立需要成本,而靜態方法可以避免這些。

Student().year is Student().year
Student().aver_age is Student().aver_age
Student().aver_age is Student.aver_age
False
True
True

可讀性更好的程式碼,看到@staticmethod我們就知道這個方法並不需要依賴物件本身的狀態。

可以在子類中被覆蓋,如果是把aver_age作為模組的頂層函式,那麼繼承自Student的子類就沒法改變Student的aver_age瞭如果不覆蓋year的話。

3、 類方法

類方法與普通的成員函式和靜態函式有不同之處,在接觸的語言中好像也沒見過這種語義,看它的定義:

一個類方法就可以通過類或它的例項來呼叫的方法,不管你是用類來呼叫這個方法還是類例項呼叫這個方法,該方法的第一個引數總是定義該方法的類物件。

記住:方法的第一個引數都是類物件而不是例項物件.
按照慣例,類方法的第一個形參被命名為 cls.任何時候定義類方法都不是必須的(類方法能實現的功能都可以通過定義一個普通函式來實現,只要這個函式接受一個類物件做為引數就可以了).

class Dog(object):
  food = "gutou"
  age = "1"
  def __init__(self,name):
    self.NAME = name
  @classmethod
  def eat(self,age): #只能是類中的變數
    # print(self.NAME)
    print(age)
    print(self.food)

  @classmethod
  def eat1(self,age): # 只能是類中的變數
    # print(self.NAME)
    age = "2"
    self.food = "tang"
  @staticmethod
  def print_1():
    print(Dog.food,Dog.age)

d = Dog("labuladuo")
d.eat(Dog.age)  #通過物件呼叫
Dog.eat(Dog.age) #通過類呼叫
print("-----1-----")
d.eat1(Dog.age)
Dog.print_1()
print("--------2-------")
Dog.eat1(Dog.age)
Dog.print_1()

輸出:

1
gutou
1
gutou
-----1-----
('tang','1')
--------2-------
('tang','1')

以上就是解析python 類方法、物件方法、靜態方法的詳細內容,更多關於python 類方法、物件方法、靜態方法的資料請關注我們其它相關文章!