Python实例方法、类方法、静态方法

实例属性:
和具体某个实例对象有关系,并且一个实例对象和另一个实例对象是不共享属性的

类属性:
类属性所属于类对象,并且多个实例对象之间共享同一个类属性

  • 实例方法:
class Foo(object):  
    def __init__(self, name):    # 定义了实例方法  
        # 实例属性
        self.name = name
        print("object")  

对象和类都可以调用,类调用需传递n个参数,对象调用只能传n-1个参数,对象调用时第一个参数默认为对象本身self。

  • 类方法classmethod
class Foo(object):  

    @classmethod  
    def test2(cls):   # 定义了类方法  
        print("class")  

对象和类都可以调用,第一个参数默认是类型cls,传入的都是类对象,主要用于工厂方法,具体的实现就交给子类处理。
调用时第一个参数忽略,只需要传n-1个参数

类方法中的cls是类本身,调用方法时传的值也必须是类的公有属性,
也就是说类方法只能操作类本身的公有字段。

  • 静态方法@staticmethod:
class Foo(object):  

    @staticmethod  
    def test3():       # 定义了静态方法  
        print("static")  

用对象对象名.方法名和类类名.方法名都可以调用,但不会给默认参数,需要传n个参数。

用静态方法,通过类直接调用时,可不需要创建对象,不会隐式传递self

class A(object):
    def foo(self, x):
        print('executing foo(%s,%s)' % (self, x))

    @classmethod
    def class_foo(cls, x):
        print('executing class_foo(%s,%s)' % (cls, x))

    @staticmethod
    def static_foo(x):
        print('executing static_foo(%s)' % x)


a = A()

a.foo(1)    # 通过类创建的对象去调用

A.class_foo(1)    # 类名调用
a.class_foo(1)    # 对象调用

A.static_foo(1)    # 类名调用
a.static_foo(1)    # 对象调用

静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。

一般建议:对于类方法和实例方法,第一个参数带有特殊性,就应该类方法就只能类型调用,实例方法就只能实例调用,因为其它方式调用的时候,第一个参数的传递就带有一定的风险。`

你可能感兴趣的:(python,实例方法,类方法,静态方法,Python,面向对象)