前面的教程中我们已经介绍了类属性可细分为实例变量、类变量和局部变量,同样的,在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面向对象的编程中,实例方法是必须要掌握的内容,静态方法与类方法用得不多,因为两者完全可以使用函数来代替,如果感兴趣可自行查阅静态方法与类方法的具体应用场景。