上一篇: 私有屬性和方法的使用 | 手把手教你入門Python之五十九 下一篇: 單例設計模式 | 手把手教你入門Python之六十一 本文來自于千鋒教育在阿裡雲開發者社群學習中心上線課程 《Python入門2020最新大課》 ,主講人姜偉。
類方法、靜态方法
類方法
- 第⼀個形參是類對象的⽅法
- 需要⽤裝飾器
來辨別其為類⽅法,對于類⽅法,第⼀個參數必須是類對象,⼀般以@classmethod
作為第⼀個參數。cls
class Dog(object):
__type = "狗"
# 類⽅法,⽤classmethod來進⾏修飾
@classmethod
def get_type(cls):
return cls.__type
print(Dog.get_type())
使⽤場景: - 當⽅法中 需要使⽤類對象 (如通路私有類屬性等)時,定義類⽅法 - 類⽅法⼀般和類屬性配合使⽤
靜态方法
- 需要通過裝飾器
來進⾏修飾,靜态⽅法既不需要傳遞類對象也不需要傳遞執行個體對象(形參沒有self/cls)。@staticmethod
- 靜态⽅法 也能夠通過 執行個體對象 和 類對象 去通路
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def eat(self, food):
print(self.name + '正在吃' + food)
p = Person('張三', 18)
# 執行個體對象在調用方法是,不需要給形參self傳參,會自動的把執行個體對象傳遞給self
p2 = Person('李四', 19)
# eat 對象方法,可以直接使用執行個體對象.方法名(參數)調用
# 使用對象名.方法名(參數)調用的方式,不需要傳遞self,會自動将對象名傳遞給self
p1.eat('紅燒牛肉泡面') # 張三正在吃紅燒牛肉泡面 直接使用執行個體對象調用方法
# 對象方法還可以使用 類對象 來調用類名.方法名()
# 這種方式,不會自動給self傳參,需要手動的指定self
Person.eat(p2, '蕃茄雞蛋蓋飯') # 李四正在吃蕃茄雞蛋蓋飯
# print(p1.eat) # <bound method Person.eat of <__main__.Person object at 0x000002B1774AEB48>>
# print(p2.eat) ## <bound method Person.eat of <__main__.Person object at 0x000002B1774AEC48>>
# print(p1.eat is p2.eat) # False
class Dog(object):
type = "狗"
def __init__(self):
name = None
# 靜态⽅法
@staticmethod
def introduce(): # 靜态⽅法不會⾃動傳遞執行個體對象和類對象
print("⽝科哺乳動物,屬于⻝⾁⽬..")
dog1 = Dog()
Dog.introduce() # 可以⽤ 執行個體對象 來調⽤ 靜态⽅法
dog1.introduce() # 可以⽤ 類對象 來調⽤ 靜态⽅法
使⽤場景: - 當⽅法中 既不需要使⽤執行個體對象(如執行個體對象,執行個體屬性),也不需要使⽤類對象 (如類屬性、類⽅法、建立執行個體等)時,定義靜态⽅法 - 取消不需要的參數傳遞,有利于 減少不必要的記憶體占⽤和性能消耗
注意點:
類中定義了同名的⽅法時,調⽤⽅法會執⾏最後定義的⽅法
class Dog:
def demo_method(self):
print("對象⽅法")
@classmethod
def demo_method(cls):
print("類⽅法")
@staticmethod
def demo_method(): # 被最後定義
print("靜态⽅法")
dog1 = Dog()
Dog.demo_method() # 結果: 靜态⽅法
dog1.demo_method() # 結果: 靜态⽅法
圖解類方法與靜态方法

class Person(object):
type = 'human'
def __init__(self, name, age):
self.name = name
self.age = age
# 這個方法要列印 name 屬性
def demo(self):
print('姓名是', self.name)
# 這個方法需要通路到類屬性 human
@classmethod
def bar(cls):
# print(cls is Person) # True
print(cls.type)
# 這個方法隻需要列印 hello world
@staticmethod
def foo():
print('hello world')
p = Person('zhangsan', 19)
p.demo() # 執行個體對象調用執行個體方法時,會自動将執行個體對象傳遞給self
Person.demo(p)
# 靜态方法可以使用類對象和執行個體對象調用
p.bar()
Person.bar()