您的位置:首页 > 其它

关于实例方法, 类方法和静态方法的思考

2017-09-12 11:10 337 查看
在Python类的学习中,对于实例方法, 类方法和静态方法的区别一直存有疑惑。 最近在学习java的过程中发现java对这方面的描述有助于对这三种方法的理解, 记录下以作备忘。参考 《java核心编程》

静态方法

静态方法是一种不能向对象实施操作的方法。

所谓不能向对象实施操作,意味着静态方法和普通函数没有什么区别, 和类对象或者类实例没有直接的绑定关系, 它只不过是恰巧存在于类中的一个方法而已。

import math
math.pow( x, y )


比如pow()方法, 它是math中的一个静态方法。在求x**y的过程中,直接针对的是x这个参数, 而不是math这个类或者类的对象。 就算脱离math这个类来描述这个操作, 也能使人明白而不产生歧义。

实例方法。

首先假设这样一个情景。我们现在需要为一个公司的开发保存所有雇员基本信息的系统, 这些信息包括姓名, 佣金以及招聘日期。 我们很容易就能写出这样的类。

class Employee(object):
def __init__(self, name, salary, date):
self.name = name
self.salary = salary
self.hire_day = date

def get_name(self):
return self.name

def get_salary(self):
return self.salary

def get_hire_day(self):
return self.hire_day


当我们实例化一个对象后, 就将get_name, get_salary, get_hire_day这些方法绑定到实例对象上。

a = Employee('mike', 3000, datetime.date(2017, 9, 1))


在调用get_name这些方法的时候, 需要在实例对象的基础上调用。在这个过程中, python隐式的把对象传递给了self参数, 而不需要手动传参。

Employee.get_name(a) # 获得属于类Employee的对象a的姓名
# 等价于
a.get_name()


这就是实例方法的调用。

类方法

还是基于Employee类来考虑。 在所有的员工中, 有一些员工的职位可能不仅仅是员工, 比如说经理。 经理相较于普通员工的薪资多了奖金这一项, 所以多了个bonus选项。 假定已经实现了manager类和get_bonus方法。

在这种情况下, 直接调用Employee.get_bonus()方法就不一定准确, 因为并不是所有的员工都是经理,自然并不是所有的员工都有get_bonus这个方法。 这种情况下就可以将其设置为类方法。即基于类而存在的方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: