首页 > 编程知识 正文

Python进阶之路 静态方法和类方法,python类方法与实例方法与静态方法

时间:2023-05-06 13:10:52 阅读:260518 作者:541

静态方法和类方法

Python类包含三种方法:实例方法、静态方法和类方法。其中,实例方法在前面的章节已经多次使用了。要想调用实例方法,必须要实例化类,然后才可以调用。也就是说,调用实例化方法需要类的实例(对象)。而静态方法在调用时根本不需要类的实例(静态方法不需要self参数),这一点和其他编程语言完全一样。

类方法的调用方式与静态方法完全一样,所不同的是,类方法与实例方法的定义方式相同,都需要一个self参数,只不过这个self参数的含义不同。对于实例方法来说,这个self参数就代表当前类的实例,可以通过self访问对象中的方法和属性。而类方法的self参数表示类的元数据,也就是类本身,不能通过self参数访问对象中的方法和属性,只能通过这个self参数访问类的静态方法和静态属性。

定义静态方法需要使用@staticmethod装饰器(decorator),定义类方法需要使用@classmethod装饰器。

class Myclass: # 实例方法 def instancemethod(self): pass # 静态方法 @staticmethod def staticmethod(): pass # 类方法 @classmethod def classmethod(self): pass

[例 10.9] 本例演示了如何定义实例方法、静态方法和类方法,并演示了如何调用这些方法

class Myclass: # 定义一个静态变量,可以被静态方法和类方法访问 name = 'Bill' def __init__(self): print('Myclass的构造方法被调用') # 定义实例变量,静态方法和类方法不能访问该变量 self.value = 20 # 定义静态方法 @staticmethod def run(): # 访问Myclass类中的静态变量name print('*', Myclass.name, '*') print('Myclass的静态方法run被调用') # 定义类方法 @classmethod # 这里self是类的元数据,不是类的实例 def do(self): print(self) # 访问Myclass类中的静态变量name print('[', self.name, ']') print('调用静态方法run') self.run() # 在类方法中不能访问实例变量,否则会抛出异常(因为实例变量需要用类的实例访问) print(self.value) print('成员方法do被调用') # 定义实例方法 def do1(self): print(self.value) print('<', self.name, '>') print(self)# 调用静态方法runMyclass.run()# 创建Myclass类的实例c = Myclass()# 通过类的实例也可以调用类方法c.do()# 通过类访问类的静态变量print('Myclass2.name', '=', Myclass.name)# 通过类调用类方法Myclass.do()# 通过类的实例访问实例方法c.do1()

输出结果:

* Bill *Myclass的静态方法run被调用Myclass的构造方法被调用<class '__main__.Myclass'>[ Bill ]调用静态方法run* Bill *Myclass的静态方法run被调用成员方法do被调用Myclass2.name = Bill<class '__main__.Myclass'>[ Bill ]调用静态方法run* Bill *Myclass的静态方法run被调用成员方法do被调用20< Bill ><__main__.Myclass object at 0x10d5bcd30>

从实例方法、静态方法和类方法的调用规则可以得出以下结论:

通过实例定义的变量只能被实例方法访问,而直接在类中定义的静态变量(如本例的name变量)即可以被实例方法访问,也可以被静态方法和类方法访问。实例方法不能被静态方法和类方法访问,但静态方法和类方法可以被实例方法访问。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。