python中實現(xiàn)靜態(tài)方法和類方法都是依賴于python的修飾器來實現(xiàn)的。 對象方法有self參數(shù),類方法有cls參數(shù),靜態(tài)方法是不需要這些附加參數(shù)的。
1、我們已經(jīng)討論了類/對象可以擁有像函數(shù)一樣的方法,這些對象方法與函數(shù)的區(qū)別只是一個額外的self變量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
# -*- coding:utf-8 -*- #!/usr/bin/python # Filename: method.py class Person: grade = 1 def __init__( self ,name): self .name = name def sayHi( self ): #加self區(qū)別于普通函數(shù) print 'Hello, your name is?' , self .name @staticmethod #聲明靜態(tài),去掉則編譯報錯;還有靜態(tài)方法不能訪問類變量和實例變量 def sayName(): #使用了靜態(tài)方法,則不能再使用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、靜態(tài)方法
要在類中使用靜態(tài)方法,需在類成員函數(shù)前面加上@staticmethod標記符,以表示下面的成員函數(shù)是靜態(tài)函數(shù)。使用靜態(tài)方法的好處是,不需要定義實例即可使用這個方法。另外,多個實例共享此靜態(tài)方法。
靜態(tài)方法是一類特殊的方法,有時可能需要寫一個屬于這個類的方法,但是這些代碼完全不會使用到實例對象本身,例如:
1
2
3
4
5
6
7
|
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作為非靜態(tài)方法同樣可以運行,但是它要提供self參數(shù),而這個參數(shù)在方法中根本不會被使用到。這里的@staticmethod裝飾器可以給我們帶來一些好處,Python不再需要為Student對象實例初始化一個綁定方法,綁定方法同樣是對象,但是創(chuàng)建需要成本,而靜態(tài)方法可以避免這些。
1
2
3
4
5
6
|
Student().year is Student().year Student().aver_age is Student().aver_age Student().aver_age is Student.aver_age False True True |
可讀性更好的代碼,看到@staticmethod我們就知道這個方法并不需要依賴對象本身的狀態(tài)。
可以在子類中被覆蓋,如果是把aver_age作為模塊的頂層函數(shù),那么繼承自Student的子類就沒法改變Student的aver_age了如果不覆蓋year的話。
3、 類方法
類方法與普通的成員函數(shù)和靜態(tài)函數(shù)有不同之處,在接觸的語言中好像也沒見過這種語義,看它的定義:
一個類方法就可以通過類或它的實例來調(diào)用的方法, 不管你是用類來調(diào)用這個方法還是類實例調(diào)用這個方法,該方法的第一個參數(shù)總是定義該方法的類對象。
記住:方法的第一個參數(shù)都是類對象而不是實例對象.
按照慣例,類方法的第一個形參被命名為 cls.任何時候定義類方法都不是必須的(類方法能實現(xiàn)的功能都可以通過定義一個普通函數(shù)來實現(xiàn),只要這個函數(shù)接受一個類對象做為參數(shù)就可以了).
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) #通過對象調(diào)用 Dog.eat(Dog.age) #通過類調(diào)用 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 類方法、對象方法、靜態(tài)方法的詳細內(nèi)容,更多關(guān)于python 類方法、對象方法、靜態(tài)方法的資料請關(guān)注服務(wù)器之家其它相關(guān)文章!
原文鏈接:https://cloud.tencent.com/developer/article/1065358