python的类方法的定义和使用都了解, 问题是什么情况下会使用python类方法,而不是普通方法或静态方法?
光阴似箭催人老,日月如移越少年。
我可以想到的例子是類方法常用來作為建構式 (__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) 的轉換手段, 使用 staticmethod 要寫死類名在方法中, 都不是那麼恰當:
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) # 哪一天這個類改名字了這裡也要改...
如果想要進一步了解有關於 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里好像只能通过闭包来实现静态变量。
类方法
静态方法
类
类变量
实例变量
静态变量
闭包
我可以想到的例子是類方法常用來作為建構式 (
__init__
) 的替代物.這邊簡單舉個例子:
這是一個滿沒用的計算器類, 但是我們先別在意那麼多, 這個 class 的建構式利用了 star expression 完成了接收任意個位置引數的功能, 我們考慮一個情況, 如果有使用者想要給定一個序列 (List or Tuple) 來建構這個 class 要怎麼做呢?
其實利用 star expression 就好了:
但是 classmethod 這個時候就是另外一個選擇了:
我們可以很輕鬆地運用 classmethod 來實作出建構式替代物, 關鍵原因就在於 classmethod 的第一個參數接收的是類對象, 這可以讓我們加工 classmethod 傳進來的引數成為標準建構式中可接收的輸入, 再利用類對象創造物件並返回.
這件事情如果交給實例方法會多一個使用
type(self)
的轉換手段, 使用 staticmethod 要寫死類名在方法中, 都不是那麼恰當:如果想要進一步了解有關於 instance method, classmethod 和 staticmethod, 可以參考:
Python 的 staticmethod 在什麼情況下用
The definitive guide on how to use static, class or abstract methods in Python
我回答過的問題: Python-QA
等一下,写个例子~
python3
类方法
和静态方法
皆可以访问类
的类变量
,但不能访问实例变量
。静态变量
,python里好像只能通过闭包
来实现静态变量
。