天天看點

類方法和靜态方法的使用 | 手把手教你入門Python之六十

上一篇: 私有屬性和方法的使用 | 手把手教你入門Python之五十九 下一篇: 單例設計模式 | 手把手教你入門Python之六十一 本文來自于千鋒教育在阿裡雲開發者社群學習中心上線課程 《Python入門2020最新大課》 ,主講人姜偉。

類方法、靜态方法

類方法

  • 第⼀個形參是類對象的⽅法
  • 需要⽤裝飾器

    @classmethod

    來辨別其為類⽅法,對于類⽅法,第⼀個參數必須是類對象,⼀般以

    cls

    作為第⼀個參數。
class Dog(object):
    __type = "狗"

    # 類⽅法,⽤classmethod來進⾏修飾
    @classmethod
    def get_type(cls):
        return cls.__type
print(Dog.get_type())           
使⽤場景: - 當⽅法中 需要使⽤類對象 (如通路私有類屬性等)時,定義類⽅法 - 類⽅法⼀般和類屬性配合使⽤

靜态方法

  • 需要通過裝飾器

    @staticmethod

    來進⾏修飾,靜态⽅法既不需要傳遞類對象也不需要傳遞執行個體對象(形參沒有self/cls)。
  • 靜态⽅法 也能夠通過 執行個體對象 和 類對象 去通路
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() # 結果: 靜态⽅法           

圖解類方法與靜态方法

類方法和靜态方法的使用 | 手把手教你入門Python之六十
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()           
類方法和靜态方法的使用 | 手把手教你入門Python之六十

配套視訊