搜尋

首頁  >  問答  >  主體

python 类方法的使用场景

python的类方法的定义和使用都了解, 问题是什么情况下会使用python类方法,而不是普通方法或静态方法?

大家讲道理大家讲道理2803 天前951

全部回覆(2)我來回復

  • 黄舟

    黄舟2017-04-18 09:43:46

    我可以想到的例子是類別方法常用來作為建構式 (__init__) 的替代物.

    這邊簡單舉個例子:

    class Calculator:
    
        def __init__(self, *numbers):
            self.numbers = numbers
    
        def sum(self):
            return sum(self.numbers)
    
        def avg(self):
            return sum(self.numbers)/len(self.numbers)
    
    if __name__ == '__main__':
        c = Calculator(1,2,3,4,5)
        print(c.sum())
        print(c.avg())    

    這是一個滿沒用的計算器類, 但是我們先別在意那麼多, 這個class 的建構式利用了star expression 完成了接收任意個位置引數的功能, 我們考慮一個情況, 如果有用戶想要給定一個序列(List or Tuple) 來建構這個class 要怎麼做呢?

    其實利用 star expression 就好了:

        numbers = [6,7,8,9,10]
        c2 = Calculator(*numbers)
        print(c2.sum())
        print(c2.avg())

    但是 classmethod 這個時候就是另一個選擇了:

    class Calculator:
    
        def __init__(self, *numbers):
            self.numbers = numbers
    
        def sum(self):
            return sum(self.numbers)
    
        def avg(self):
            return sum(self.numbers)/len(self.numbers)
    
        @classmethod
        def fromseq(cls, seq):
            return cls(*seq)
    
    if __name__ == '__main__':
        numbers = [6,7,8,9,10]
        c3 = Calculator.fromseq(numbers)
        print(c3.sum())
        print(c3.avg())

    我們可以很輕鬆地運用classmethod 來實行建構式替代物, 關鍵原因就在於classmethod 的第一個參數接收的是類別物件, 這可以讓我們加工classmethod 傳進來的引數成為標準建構式中可接收的輸入, 再利用類別物件創造物件並返回.

    這件事情如果交給實例方法會多一個使用 type(self) 的轉換手段, 使用 staticmethod 要寫死類名在方法中, 都不是那麼恰當:

    class Calculator:
        ...(略)...
        
        @classmethod
        def fromseq(cls, seq):
            return cls(*seq)
        
        def fromseq2(self, seq):
            return type(self)(*seq) # 多一個步驟
            
        @staticmethod
        def fromseq3(seq):
            return Calculator(*seq) # 哪一天這個類改名字了這裡也要改...

    如果想要進一步了解有關於 instance method, classmethod 和 staticmethod, 可以參考:

    • Python 的 staticmethod 在何種情況下用

    • The definitive guide on how to use static, class or abstract methods in Python


    我回答過的問題: Python-QA

    回覆
    0
  • 阿神

    阿神2017-04-18 09:43:46

    等一下,寫個例子~


    python3

    class 类方法演示(object):
    
        类变量 = '哈哈'
    
        def __init__(实例):
            实例.实例变量 = '实例值'
    
        def 测试1(实例): #实例方法
            print('测试1')
            print(实例)
    
        @classmethod #类方法
        def 测试2(此类): # 此类 就是 类方法演示 自身
            print(此类)
            print('测试2')
            print(类方法演示.类变量)
            print('----------------')
    
        @staticmethod #静态方法
        def 测试3(): # 这里可以不传递参数。
            print(类方法演示.类变量)
            print('测试3')
    
    if __name__ == '__main__':
        对象 = 类方法演示()
        对象.测试1()
        对象.测试2()
        对象.测试3()
        类方法演示.测试3()
    

    类方法静态方法皆可以访问类变量,但不能访问实例变量
    静态变量,python里好像只能通过闭包来实现静态变量

    回覆
    0
  • 取消回覆