靜態方法
靜態方法的作用是可以更好的組織代碼,防止代碼變大後變得比較混亂。靜態方法只是名義上歸類管理,實際上在靜態方法裏訪問不了類或則實例中的任何屬性
靜態方法使用場景
1)我們要寫一個只在類中運行而不在實例中運行的方法.
2)經常有一些跟類有關係的功能但在運行時又不需要實例和類參與的情況下需要用到靜態方法.
3)比如更改環境變量或者修改其他類的屬性等能用到靜態方法.
4)這種情況可以直接用函數解決, 但這樣同樣會擴散類內部的代碼,造成維護困難.
調用方式
調用方式: 既可以被類直接調用,也可以通過實例調用 需要用 修飾器 @staticmethon 來標識, 無參數
class Dog(object):
def __init__(self,name):
self.name = name
@staticmethod
def eat():
print("I am a static method")
d = Dog("ChenRonghua")
d.eat() #方法1:使用實例調用
Dog.eat() #方法2:使用類直接調用
類方法
類方法:無需實例化直接被類調用 ,只能訪問類變量,不能訪問實例變量
類方法使用場景
類方法使用場景: 當我們還未創建實例,但是需要調用類中的方法
調用方式
調用方式: 既可以被類直接調用,也可以通過實例調用 需要用 修飾器 @classmethod 來標識
class Dog(object):
name = '類變量' #在這裏如果不定義類變量僅定義實例變量依然報錯
def __init__(self,name):
self.name = '實例變量'
self.name = name
@classmethod
def eat(self,food):
print("%s is eat %s"%(self.name,food))
Dog.eat('包子') # 方法1:使用類直接調用
d = Dog("ChenRonghua")
d.eat("包子") # 方法2:使用實例d調用
屬性方法
屬性方法把一個方法變成一個屬性,隱藏了實現細節,調用時不必加括號直接d.eat即可調用self.eat()方法
需要用 修飾器 @property 來標識
class Dog(object):
def __init__(self, name):
self.name = name
@property
def eat(self):
print(" %s is eating" % self.name)
d = Dog("ChenRonghua")
d.eat()
# 調用會出以下錯誤, 說NoneType is not callable, 因爲eat此時已經變成一個靜態屬性了,
# 不是方法了, 想調用已經不需要加()號了,直接d.eat就可以了
魔法方法
type生成類調用順序
__new__ : 先於__init__方法,每生成一個實例執行一次,__new__ 類方法創建實例對象
__init__ : __init__方法每生成一個實例就會執行一次,初始化實例對象
__call__ : 後與__init__方法,C()() 使用類再加一個括號調用, C爲類名稱
__del__ : 析構方法,刪除無用的內存對象(當程序結束會自動自行析構方法)