Python 类方法、静态方法和实例方法之间的区别
在本教程中,我们将学习类方法、静态方法和实例方法。这些方法是Python面向对象编程的核心概念。每个Python爱好者都应该熟悉这些方法以及根据需求如何使用它们。让我们简要介绍实例方法、类方法和静态方法。
什么是实例方法
正如名称所示,实例方法绑定到类实例,并对对象(实例)变量提供的数据/值执行一组操作。如果我们在方法中使用实例变量,这些方法被称为实例方法。它可以修改对象状态。self关键字是与实例方法一起使用的第一个参数,self指的是当前对象。
示例
class Employee:
# constructor
def __init__(self, name, department):
# Instance variable
self.name = name
self.department = department
# instance method to access instance variable
def show(self):
print('Name:', self.name, 'Department:', self.department)
obj = Employee('Craig', 'IT')
obj.show()
输出:
Name: Craig Department: IT
解释 –
我们在上述代码中定义了使用Python对象创建实例变量的构造函数。在 show() 函数中,我们使用self关键字访问了两个变量。我们可以使用以下代码访问和修改实例变量。
示例2
class Employee:
# constructor
def __init__(self, name, department):
# Instance variable
self.name = name
self.department = department
# instance method to access instance variable
def show(self):
print('Name:', self.name, 'Department:', self.department)
obj = Employee('Craig', 'IT')
obj.show()
obj.name = 'Mathew'
obj.department = 'HR'
obj.show()
输出:
Name: Craig Department: IT
Name: Mathew Department: HR
说明 –
我们可以看到我们访问了实例变量并改变了它的值。在 show() 函数中,实例方法打印了更新后的值。
类方法
类方法绑定到类,而不是实例。它可以修改类的状态,也就是说可以全局改变类的配置。它只能访问类变量。类方法用于创建工厂方法。类方法的语法有所不同;它们接受 cls 作为参数,指向类本身,而不是self参数。它不能修改实例状态。但是,类方法所做的更改会反映在类的所有实例上。装饰器 @classemethod 或者 classmethod() 可以定义类方法。让我们理解一下以下示例。
示例
class Employee:
# class variable
salary = 25000
def __init__(self, name, department):
# Instance variable
self.name = name
self.department = department
# instance method to access instance variable
def show(self):
print('Name:', self.name, 'Department:', self.department, 'Salary:', Employee.salary)
def change_salary(cls, salary):
cls.salary = salary
obj = Employee('Craig', 'IT')
obj.show()
Employee.change_salary(45000)
obj.show()
输出:
Name: Craig Department: IT Salary: 25000
Name: Craig Department: IT Salary: 45000
解释 –
在上面的代码中,我们定义了类变量name salary和类方法change_salary()。change_salary()函数访问了类变量salary,并用于修改所有员工的工资。我们在创建对象的部分也做了同样的事情。
静态方法
静态方法既不使用self参数也不使用cls参数;通常用于执行独立的实用函数。Python中的静态方法与Java和C++中的静态方法类似,它们不能修改类或实例的行为。@staticmethod装饰器或staticmethod()方法用于定义静态方法。让我们看下面的示例。静态方法可以使用类名和类的实例来访问。
示例
class Employee:
@staticmethod
def sample_method(x):
print('Inside static method', x*x)
# call static method
Employee.sample_method(10)
# can be called using object
emp = Employee()
emp.sample_method(10)
输出:
Inside static method 100
Inside static method 100
说明 –
我们在上述方法中创建了一个接受x作为参数的静态方法。我们将其与自身相乘,并使用类名和实例访问了静态方法。
让我们了解类方法、实例方法和静态方法之间的区别。
类方法 vs 静态方法 vs 实例方法
我们将使用一些参数描述这些方法之间的一些重要区别。这些区别将帮助您更好地理解面向对象编程的概念。
方法调用
- 可以使用类的对象/实例访问实例方法。
- 可以使用类名和类的对象访问类方法和静态方法。
修改
- 实例方法可以修改实例变量的行为。
- 类方法可以修改类的行为,并反映到整个类的所有实例中。
- 静态方法在独立性中执行任务。它们与类或实例方法没有任何交互。
属性访问
- 实例方法可以访问类变量和实例变量。
- 类方法可以访问类变量。
- 静态方法无法访问类变量和静态变量。因此,它无法改变类或实例状态的行为。
类绑定和实例绑定
- 实例方法与类的对象绑定,因此可以使用对象访问它们。
- 最好使用类名访问类方法和静态方法,因为它们绑定到类。
重要备注
- 要对Python的面向对象编程概念有很好的掌握,我们需要理解类、实例和静态方法。
- 实例方法使用self参数访问类实例。
- 类方法不需要类实例。它们使用 cls 参数代替self参数。
- 静态方法既不使用self,也不使用cls。它们像常规函数一样,但可以通过类名访问。
- 静态方法和类方法在通信和(在一定程度上)强制开发人员对类设计的意图方面起到作用。它们可以带来维护的好处。
结论
我们讨论了类、静态和实例方法之间的一些重要区别。我们还探讨了示例并展示了使用这些方法的不同场景。