Python面向对象中静态方法与类方法(第7节)


前面的教程中我们已经介绍了类属性可细分为实例变量、类变量和局部变量,同样的,在Python类中的方法也可以具体可划分为实例方法静态方法类方法

实例方法:第一个参数必须是实例对象,一般约定为“self”,通过它来传递实例的属性和方法(也可以传递类的属性和方法),只能由实例对象调用;

静态方法:没有self、cls这样的特殊参数,但无法传递类和实例的任何属性和方法,实例对象和类名都可以调用;

类方法:第一个参数一般约定为“cls”(代指类本身),通过它来传递类的属性和方法(不能传递实例的属性和方法),实例对象和类名都可以调用。

1、实例方法

在Python面向对象的编程中,一般情况下在类中定义的方法(函数)默认都是实例方法。例如:

动手练一练:

class Person:
    # 定义类变量
    sex = "男"

    # 构造方法(初始化函数):名称固定为__init__,当创建类的对象时,系统会自动调用该方法
    def __init__(self, name, age):
        self.name = name  # 实例变量
        self.age = age
        print("这是构造方法...\n")  # 注意这里面有一个自动换行符“\n”

    # 实例方法(又称:普通方法)
    def say(self):
        print("这是实例方法:")
        print(self.name)  # 传递 实例变量
        print(self.age)
        print(self.sex)  # 传递 类变量

# 创建一个类的实例对象
person = Person("张三", 15)  #会自动调用构造方法,输出 这是构造方法...

# 实例方法的调用:只能由实例对象调用,不能用类名调用
person.say()
# Person.say() # 错误

执行以上代码,输出结果为:

这是构造方法...

这是实例方法
张三
15

上面的例子中,实例方法say()必须通过类的实例对象person来调用,所以这个函数的第一个位置参数必须是self。如果直接使用类名Person调用say()方法,Python解释器会报错。

2、静态方法

静态方法是指类中不需要通过实例对象来调用就可以使用的方法。需要注意的是,这类方法不需要通过实例对象来调用,但类的实例对象也是可以调用这类函数。在Python中使用装饰器@staticmethod来声明静态方法。静态方法中不能操作类和实例对象的任何属性和方法。例如:

动手练一练:

class Person:
    # 定义类变量
    sex = "男"

    # 构造方法(初始化函数):名称固定为__init__,当创建类的对象时,系统会自动调用该方法
    def __init__(self, name, age):
        self.name = name  # 实例变量
        self.age = age
        print("这是构造方法...\n")  # 注意这里面有一个自动换行符“\n”

    # 静态方法:无法传递 类和实例 的任何属性和方法
    @staticmethod
    def say():
        print("这是静态方法")
        # print(self.name)  # 错误
        # print(self.sex)  # 错误

# 创建一个类的实例对象
person = Person("张三", 15)  #会自动调用构造方法,输出 这是构造方法...

# 实例对象和类名均可调用静态方法
person.say()
Person.say()

执行以上代码,输出结果为:

这是构造方法...

这是静态方法
这是静态方法

上面的例子中,由于静态方法没有self参数,所以它无法访问类和实例对象的任何属性和方法。静态方法跟定义它的类没有直接的关系,只是起到类似函数的作用。

3、类方法

类方法,顾名思义就是类体中所拥有的方法,它可以传递类的属性和方法,但不能传递实例的属性和方法。其定义时,除了使用@classmethod装饰之外,该方法的第一个位置参数默认为cls(为class的简写,代表类本身)。类方法既可以通过实例对象来引用,也可以通过类名来引用。例如:

动手练一练:

class Person:
    # 定义类变量
    sex = "男"

    # 构造方法(初始化函数):名称固定为__init__,当创建类的对象时,系统会自动调用该方法
    def __init__(self, name, age):
        self.name = name  # 实例变量
        self.age = age
        print("这是构造方法...\n")  # 注意这里面有一个自动换行符“\n”

    # 类方法:可传递类的属性和方法,但不能传递实例的属性和方法
    @classmethod
    def say(cls):
        print("这是静态方法:")
        print(cls.sex)
        # print(self.name)  # 错误
        # print(self.age)  # 错误

# 创建一个类的实例对象
person = Person("张三", 15)  #会自动调用构造方法,输出 这是构造方法...

# 实例对象和类名均可调用类方法
person.say()
Person.say()

执行以上代码,输出结果为:

这是构造方法...

这是静态方法

这是静态方法

上面的例子中,Python会自动将类本身绑定到cls参数,所以在调用类方法时,无需再为cls参数传递参数。

在Python面向对象的编程中,实例方法是必须要掌握的内容,静态方法与类方法用得不多,因为两者完全可以使用函数来代替,如果感兴趣可自行查阅静态方法与类方法的具体应用场景。