84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
python的类方法的定义和使用都了解, 问题是什么情况下会使用python类方法,而不是普通方法或静态方法?
光阴似箭催人老,日月如移越少年。
我可以想到的例子是类方法常用来作为建构式 (__init__) 的替代物. __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)
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 要怎么做呢?
但是 classmethod 这个时候就是另外一个选择了:
这件事情如果交给实例方法会多一个使用 type(self) 的转换手段, 使用 staticmethod 要写死类名在方法中, 都不是那么恰当:
Python 的 staticmethod 在什么情况下用
等一下,写个例子~
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__
) 的替代物.__init__
) 的替代物.這邊簡單舉個例子:
這是一個滿沒用的計算器類, 但是我們先別在意那麼多, 這個 class 的建構式利用了 star expression 完成了接收任意個位置引數的功能, 我們考慮一個情況, 如果有使用者想要給定一個序列 (List or Tuple) 來建構這個 class 要怎麼做呢?
其實利用 star expression 就好了:
但是 classmethod 這個時候就是另外一個選擇了:
我們可以很輕鬆地運用 classmethod 來實作出建構式替代物, 關鍵原因就在於 classmethod 的第一個參數接收的是類對象, 這可以讓我們加工 classmethod 傳進來的引數成為標準建構式中可接收的輸入, 再利用類對象創造物件並返回.
這件事情如果交給實例方法會多一個使用
这边简单举个例子:type(self)
这是一个满没用的计算器类, 但是我们先别在意那么多, 这个class 的建构式利用了star expression 完成了接收任意个位置引数的功能, 我们考虑一个情况, 如果有使用者想要给定一个序列(List or Tuple) 来建构这个class 要怎么做呢?
其实利用 star expression 就好了:-
rrreee
我们可以很轻松地运用classmethod 来实作出建构式替代物, 关键原因就在于classmethod 的第一个参数接收的是类对象, 这可以让我们加工classmethod 传进来的引数成为标准建构式中可接收的输入, 再利用类对象创造物件并返回. -
如果想要进一步了解有关于 instance method, classmethod 和 staticmethod, 可以参考:但是 classmethod 这个时候就是另外一个选择了:
rrreee这件事情如果交给实例方法会多一个使用
rrreeetype(self)
的转换手段, 使用 staticmethod 要写死类名在方法中, 都不是那么恰当:Python 的 staticmethod 在什么情况下用
🎜 🎜🎜The definitive guide on how to use static, class or abstract methods in Python🎜🎜 🎜 🎜 🎜🎜我回答过的问题🎜: Python-QA🎜等一下,写个例子~
python3
类方法
和静态方法
皆可以访问类
的类变量
,但不能访问实例变量
。静态变量
,python里好像只能通过闭包
来实现静态变量
。