就三种方法之间的异同点简单讨论一下~
一、类的普通方法
class Test():
def ordinary_method(self):
print("This is ordinary-method")
if __name__=="__main__":
Test().ordinary_method()
1、类的普通方法需要一个表示对象本身的变量
self
,以便在方法中获取自身变量。
2、类的普通方法只能通过对象调用,而不能通过类直接调用。
错误示例:
1、不传self
class Test():
def ordinary_method():
print("This is ordinary-method")
if __name__=="__main__":
Test().ordinary_method()
报错如下:
Traceback (most recent call last):
File “/usercode/file.py”, line 8, in
Test().ordinary_method()
TypeError: ordinary_method() takes 0 positional arguments but 1 was given
1、类在调用普通方法时,会自动传一个代表自身对象的参数,而如果定义方法时没有声明此参数,则会出现上述错误。
2、理论上该参数可以用任一变量(有特殊作用的除外)表示,但是为了表意明确,统一用self
代表类的对象本身。
2、使用类直接调用
class Test():
def ordinary_method(self):
print("This is ordinary-method")
if __name__=="__main__":
Test.ordinary_method()
报错如下:
Traceback (most recent call last):
File “/usercode/file.py”, line 8, in
Test.ordinary_method()
TypeError: ordinary_method() missing 1 required positional argument: ‘self’
二、@classmethod和@staticmethod
先看一段代码:
class Test():
@classmethod
def class_method(cls):
print("This is class-method")
@staticmethod
def static_method():
print("This is static-method")
if __name__=="__main__":
print("-"*100)
Test().class_method()
Test.class_method()
print("-"*100)
Test().static_method()
Test.static_method()
print("-"*100)
输出如下:
----------------------------------------------------------------------------------------------------
This is class-method
This is class-method
----------------------------------------------------------------------------------------------------
This is static-method
This is static-method
----------------------------------------------------------------------------------------------------
根据以上情况,简单总结下类方法和静态方法的异同:
相同点:
- 都可以被类直接调用;
- 都可以被类的对象调用。
不同点:
- 类方法需要传一个代表类本身的变量cls,静态方法不用;
- 类方法可以通过cls获取类本身的属性(变量和方法),静态方法只能显式传入。
初步总结,以后继续补充~