# coding=utf-8
class A(object): 
    def __init__(self, x=0):
        self.x = x
 
    #类实例方法  # 最常见的实例方法
    def foo(self, y=0):
        print self.x, y
 
    #类方法  # cls即为类自身
    @classmethod   
    def class_foo(cls, x=1, y=1):  
        return cls(x)  # 因为类方法可以传参一个cls参数,所以可以调用类的相关信息,而静态方法是一个独立的函数,也是可以调用的,这里为了简单,没有调用静态方法
 
    #静态方法   # 不能传递和类或实例相关的参数,如cls或self,但可以传递其他参数
    @staticmethod  
    def static_foo(x=2):  
        return A(x)
测试结果
 
>>> a = A()  # 类实例化
>>> a.x  1
>>> a.foo() # 调用类实例方法,可以使用self.x 取出类实例化的(即初始值)
0 0
 
>>> b = A.class_foo() # 调用类方法
>>> b.x  1
 
>>> c = A.static_foo() # 调用类的静态方法
>>> c.x  2
下面说说区别,实例方法隐含的参数为类实例self,而类方法隐含的参数为类本身cls。 
静态方法无隐含参数,主要为了类实例也可以直接调用静态方法。
 
所以逻辑上,类方法应当只被类调用,实例方法实例调用,静态方法两者都能调用。主要区别在于参数传递上的区别,实例方法悄悄传递的是self引用作为参数,而类方法悄悄传递的是cls引用作为参数。

  实例方法,类方法,静态方法都可以通过实例或者类调用,只不过实例方法通过类调用时需要传递实例的引用(python 3可以传递任意对象,其他版本会报错)。

三种方法从不同层次上来对方法进行了描述:实例方法针对的是实例,类方法针对的是类,他们都可以继承和重新定义,而静态方法则不能继承,可以认为是全局函数。

  

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-05-08
  • 2021-08-30
  • 2021-07-01
  • 2022-12-23
猜你喜欢
  • 2021-07-30
  • 2022-12-23
  • 2022-01-06
  • 2021-05-26
相关资源
相似解决方案