靜態(tài)方法:
在面向?qū)ο笕筇匦远鄳B(tài)中,我們用到了一個類似裝飾器的函數(shù)
@staticmethod
其實他就是靜態(tài)方法,一個裝飾器疲吸,相當(dāng)于python內(nèi)置裝飾器座每,那讓我們看看它的作用是什么
class People(object):
def __init__(self, name):
self.name = name
def eat(self, food):
print('%s is eating %s' %(self.name, food))
man1 = People('James')
man1.eat('chicken')
這里定義了一個People類,擁有一個eat函數(shù)摘悴,可以看到能夠正常執(zhí)行峭梳,那讓我們給這個eat函數(shù)加上這個靜態(tài)方法看看會怎么樣
eat()
少了一個參數(shù)food
,這是為什么呢蹂喻?明明傳入了'chicken'
這就是靜態(tài)方法的作用葱椭,把一個類中的函數(shù)變?yōu)椤办o態(tài)函數(shù)”,名義上還是屬于類口四,但是類中的所用方法屬性它都調(diào)用不了了
eat()
少了一個參數(shù)food
是因為這個時候eat()
函數(shù)里面的self
并不是類中的self
了孵运,而是這個函數(shù)的一個普通形參,自己傳遞參數(shù)‘chicken’并沒有給food
而是給了self
蔓彩,所以說eat()
少了一個參數(shù)food
那我們怎么調(diào)用這個靜態(tài)方法呢治笨?
class People(object):
def __init__(self, name):
self.name = name
@staticmethod
def eat(food):
print('James is eating %s' % food)
man1 = People('James')
People.eat('chicken')
雖然靜態(tài)方法在類中與類沒有任何關(guān)聯(lián)了,但是依然屬于類粪小,所以我們可以通過類名調(diào)用
總計一下靜態(tài)方法:名義上還是歸類的大磺,但是訪問不了類中的實例變量等其他屬性
靜態(tài)方法@staticmethod
用處不多,但是還是需要了解
類方法:
很容易理解探膊,先來說一下類方法的作用
讓這個函數(shù)只能訪問類變量杠愧,而不能訪問實例變量
還是這個例子,也是一個裝飾器逞壁,使用之后報錯People沒有屬性name流济,因為這個時候函數(shù)eat已經(jīng)訪問不到構(gòu)造函數(shù)里的實例變量了
既然這樣,我們就添加個類變量name把
class People(object):
name = 'James'
def __init__(self, name):
self.name = name
@classmethod
def eat(self, food):
print('%s is eating %s' % (self.name, food))
man1 = People('Jamescxcfyn')
man1.eat('chicken')
這個時候?qū)嵗瘋鞯膮?shù)就用不到了腌闯,因為這個函數(shù)只會調(diào)用類變量
可能用到的地方不多绳瘟,但是還是要了解
屬性方法:
把一個函數(shù)(方法),變成一個靜態(tài)屬性
通過
@property
可以把下面這個函數(shù)變?yōu)橐粋€靜態(tài)屬性姿骏,這個時候再調(diào)用就必須要把函數(shù)名后面的括號去掉糖声,因為這個時候它是一個靜態(tài)屬性,否則的話就會報錯
可以看到我把第二個參數(shù)food去掉了分瘦,因為不能像以前一樣傳參數(shù)了蘸泻,既不能用以前的方法傳參,也不不能像給屬性賦值一樣給它賦值嘲玫,而是有獨特的方法傳入?yún)?shù)
class People(object):
name = 'James'
def __init__(self, name):
self.name = name
self.__food = None
@property
def eat(self):
print('%s is eating %s' % (self.name, self.__food))
@eat.setter
def eat(self, food):
# print('set food to eat', food)
self.__food = food
man1 = People('James')
# print(man1.__food)
man1.eat = 'chicken'
man1.eat # James is eating chicken
通過定義一個私有變量悦施,或者普通的變量也可以,這里用私有變量是為了更好的體現(xiàn)屬性方法的優(yōu)點去团,只提供一個接口操作抡诞,代碼內(nèi)容不可見穷蛹,然后使用@xxx.setter
方法來設(shè)置這個屬性方法中的值
當(dāng)然,也可以刪除昼汗,使用@xxx.deleter
方法
class People(object):
name = 'James'
def __init__(self, name):
self.name = name
self.__food = None
@property
def eat(self):
print('%s is eating %s' % (self.name, self.__food))
@eat.setter
def eat(self, food):
# print('set food to eat', food)
self.__food = food
@eat.deleter
def eat(self):
del self.__food
man1 = People('James')
# print(man1.__food)
man1.eat = 'chicken'
man1.eat # James is eating chicken
del man1.eat
man1.eat # AttributeError: 'People' object has no attribute '_People__food'
這樣肴熏,就實現(xiàn)了刪除
屬性方法屬于三種方法中用的比較多的方法,隨著使用會發(fā)現(xiàn)它的優(yōu)點
轉(zhuǎn)載請注明出處
python自學(xué)技術(shù)互助扣扣群:670402334