python 类方法的使用场景

查看:423
本文介绍了python 类方法的使用场景的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

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

解决方案

我可以想到的例子是類方法常用來作為建構式 (__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-QA

这篇关于python 类方法的使用场景的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆