解析python 類方法、對象方法、靜態(tài)方法
python中實現(xiàn)靜態(tài)方法和類方法都是依賴于python的修飾器來實現(xiàn)的。 對象方法有self參數(shù),類方法有cls參數(shù),靜態(tài)方法是不需要這些附加參數(shù)的。
1、我們已經(jīng)討論了類/對象可以擁有像函數(shù)一樣的方法,這些對象方法與函數(shù)的區(qū)別只是一個額外的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區(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標(biāo)記符,以表示下面的成員函數(shù)是靜態(tài)函數(shù)。使用靜態(tài)方法的好處是,不需要定義實例即可使用這個方法。另外,多個實例共享此靜態(tài)方法。
靜態(tài)方法是一類特殊的方法,有時可能需要寫一個屬于這個類的方法,但是這些代碼完全不會使用到實例對象本身,例如:
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)方法可以避免這些。
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)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python利用matplotlib生成圖片背景及圖例透明的效果
這篇文章主要給大家介紹了Python利用matplotlib生成圖片背景及圖例透明效果的相關(guān)資料,文中給出了詳細的示例代碼,相信對大家具有一定的參考家價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧。2017-04-04
Python3 獲取一大段文本之間兩個關(guān)鍵字之間的內(nèi)容方法
今天小編就為大家分享一篇Python3 獲取一大段文本之間兩個關(guān)鍵字之間的內(nèi)容方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10
在Keras中實現(xiàn)保存和加載權(quán)重及模型結(jié)構(gòu)
這篇文章主要介紹了在Keras中實現(xiàn)保存和加載權(quán)重及模型結(jié)構(gòu),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06
pyenv與virtualenv安裝實現(xiàn)python多版本多項目管理
這篇文章主要介紹了pyenv與virtualenv安裝實現(xiàn)python多版本多項目管理過程,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08

