python 类方法的使用场景
大家讲道理
大家讲道理 2017-04-18 09:41:46
0
2
955

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

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(2)
黄舟

我可以想到的例子是类方法常用来作为建构式 (__init__) 的替代物. __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)

这边简单举个例子:
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) # 哪一天這個類改名字了這裡也要改...

这是一个满没用的计算器类, 但是我们先别在意那么多, 这个class 的建构式利用了star expression 完成了接收任意个位置引数的功能, 我们考虑一个情况, 如果有使用者想要给定一个序列(List or Tuple) 来建构这个class 要怎么做呢?

    其实利用 star expression 就好了:
  • rrreee

    但是 classmethod 这个时候就是另外一个选择了:

    rrreee
  • 我们可以很轻松地运用classmethod 来实作出建构式替代物, 关键原因就在于classmethod 的第一个参数接收的是类对象, 这可以让我们加工classmethod 传进来的引数成为标准建构式中可接收的输入, 再利用类对象创造物件并返回.
  • 这件事情如果交给实例方法会多一个使用 type(self) 的转换手段, 使用 staticmethod 要写死类名在方法中, 都不是那么恰当:

    rrreee
如果想要进一步了解有关于 instance method, classmethod 和 staticmethod, 可以参考:

Python 的 staticmethod 在什么情况下用

🎜 🎜🎜The definitive guide on how to use static, class or abstract methods in Python🎜🎜 🎜 🎜 🎜🎜我回答过的问题🎜: Python-QA🎜
阿神

等一下,写个例子~


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里好像只能通过闭包来实现静态变量

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板