关于实例方法, 类方法和静态方法的思考
2017-09-12 11:10
337 查看
在Python类的学习中,对于实例方法, 类方法和静态方法的区别一直存有疑惑。 最近在学习java的过程中发现java对这方面的描述有助于对这三种方法的理解, 记录下以作备忘。参考 《java核心编程》
所谓不能向对象实施操作,意味着静态方法和普通函数没有什么区别, 和类对象或者类实例没有直接的绑定关系, 它只不过是恰巧存在于类中的一个方法而已。
比如pow()方法, 它是math中的一个静态方法。在求x**y的过程中,直接针对的是x这个参数, 而不是math这个类或者类的对象。 就算脱离math这个类来描述这个操作, 也能使人明白而不产生歧义。
当我们实例化一个对象后, 就将get_name, get_salary, get_hire_day这些方法绑定到实例对象上。
在调用get_name这些方法的时候, 需要在实例对象的基础上调用。在这个过程中, python隐式的把对象传递给了self参数, 而不需要手动传参。
这就是实例方法的调用。
在这种情况下, 直接调用Employee.get_bonus()方法就不一定准确, 因为并不是所有的员工都是经理,自然并不是所有的员工都有get_bonus这个方法。 这种情况下就可以将其设置为类方法。即基于类而存在的方法。
静态方法
静态方法是一种不能向对象实施操作的方法。所谓不能向对象实施操作,意味着静态方法和普通函数没有什么区别, 和类对象或者类实例没有直接的绑定关系, 它只不过是恰巧存在于类中的一个方法而已。
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这个方法。 这种情况下就可以将其设置为类方法。即基于类而存在的方法。
相关文章推荐
- 思考:关于静态与非静态java方法
- 关于python的类方法、实例方法和静态方法区别
- 关于静态方法为什么不能被重写的一点思考以及overload的一些坑。
- 一起谈.NET技术,关于c#静态方法和实例方法的辨析和应用
- 关于静态方法和实例方法的一些误区。
- 【转】一起谈.NET技术,关于c#静态方法和实例方法的辨析和应用
- 关于c#静态方法和实例方法的辨析和应用(转载)
- 关于 静态方法 继承 的思考
- 关于静态方法和实例方法的一些误区。
- 关于静态方法与非静态方法的思考
- Objective-C 关于静态方法与实例方法的转载
- 关于Python中静态方法、实例方法、类方法、普通方法
- 关于静态变量,成员变量,静态方法,实例方法的用法及区别
- 关于静态方法为什么不能被重写的一点思考以及overload的一些坑
- 关于c#静态方法和实例方法的辨析和应用
- 关于c#静态方法和实例方法的辨析和应用
- Objective-C 关于静态方法与实例方法
- 关于静态方法和实例方法的一些误区。
- 关于c#静态方法和实例方法的辨析和应用
- 关于静态方法为什么不能被重写的一点思考以及overload的一些坑。