类的方法有三种:
-
一、是通过def定义,需要至少传递一个参数,一般用self,这样的方法必须通过一个类的实例去访问;
-
二、是在def前面加上@classmethod,这种类方法的一个特点就是可以通过类名去调用,但是也必须传递一个参数,一般用cls表示class,表示可以通过类直接调用;
-
三、是在def前面加上@staticmethod,这种类方法是静态的类方法,参数可以为空,支持类名和对象两种调用方式;
代码示例:
class A(object):
def __init__(self):
self.name = "name"
# 只能通过示例化类的方式来进行调用
def test001(self):
print("test001" , self.name)
# 不通过实例化可以调用,但是只能通过(类名.方法)或(类名.属性)类属性或类方法
@staticmethod
def test002():
print("test002")
# 不通过实例化可以调用,但是只能通过(cls.方法)或(cls.属性)类属性或类方法
@classmethod
def test003(cls):
print("test003,并下方直接通过类方法调用了test002")
cls.test002()
# 不通过实例化可以调用,但是只能通过(类名.方法)或(类名.属性)类属性或类方法
@staticmethod
def test004():
print("test004,并下方通过(类名.方法)的方式调用了test002")
A.test002()
a=A()
a.test001() # 输出:test001 name
a.test002() # 输出:test002
a.test003() # 输出:test003,并下方通过类方法调用了test002 /n test002
a.test004() # 输出:test004,并下方通过(类名.方法)的方式调用了test002 /n test002
A.test001() # 报错: TypeError: test001() missing 1 required positional argument: 'self'
A.test002() # 输出:test002
a.test003() # 输出:test003,并下方通过类方法调用了test002 /n test002
a.test004() # 输出:test004,并下方通过(类名.方法)的方式调用了test002 /n test002