1. 面向对象编程(Object Oriented Programming, OOP)
1.1 面向对象与面向过程
- 面向过程 – 是将计算机任务交由函数(Function)来处理,通过将复杂的任务分割成一个一个的小函数来降低系统复杂度。
- 面向对象 – 是为程序构建一个一个的对象(Object),对象内部有一些属性(Property),也有一些处理信息的方法(Method)。程序的执行就是一系列信息在各个对象之间传递。
对Python而言,所有的数据类型,比如string、list、int…都是对象。
上述是Python预置的对象,而自定义的对象这一数据类型就是面向对象中的类(Class)概念。
1.2 类(Class)和实例(Instance)
- 类:是一个抽象概念、一套综合性的方法。如果类比于自然界,就是Person、Sports…
- 实例:是根据类创建出来的具体的操作对象。比如Person中的骚老师, Planet中的地球
==> 面向对象的设计思路 —— 抽象出Class,根据Class创建Instance.
比如:
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def print_infomation(self):
print('Name: %s, Age: %s' % (self.name, self.age))
"""创建一个实例"""
sls = Person('Sao Laoshi', 21)
# 调用print_infomation()方法
sls.print_infomation()
运行结果:
Name: Sao Laoshi, Age: 21
1.3 类的方法
类中有三种方法:实例方法,静态方法和类方法
- 实例方法:需要绑定要一个对象上,第一个参数默认使用self,会把对象作为第一个参数传递进来;
- 静态方法:使用装饰器@staticmethod进行定义,类和对象都可以调用,不需要默认参数;
- 类方法:使用装饰器@classmethod进行定义,类和对象都可以调用,第一个参数默认使用cls,会把类作为第一个参数传递进来。
动态添加类方法
- 直接赋值 (整了那么久,直接赋值还是yyds!)
"""外部添加方法"""
def say_hello(self):
print('hello !')
print(self.name)
# 把新定义的函数赋给类
Person.say_hello = say_hello
sls.say_hello()
运行结果:
hello !
Sao Laoshi
- 通过MethodType模块添加到类/实例上
这个方法只适合于给类绑定属性,不适合添加动态方法
比如:
"""用MethodType将方法绑定给类"""
from types import MethodType
def say_bye(self):
print('Byebye !')
print(self.name)
Person.say_bye = MethodType(say_bye, Person) # 调用方法
sls.say_bye() # 检测
运行结果:
结果显示:Person没有name属性,而不是实例sls没有name,虽然不知道为什么,但是可以说明这方法有点风险。MethodType最好只用于动态添加属性,不要调用之前的属性。
但如果直接把方法绑到实例上,是没有问题的。
from types import MethodType
def say_bye(self):
print('Byebye !')
print(self.name)
sls.say_bye = MethodType(say_bye, sls)
sls.say_bye()
运行结果:
Byebye !
Sao Laoshi
直接绑定到实例上就没有问题,但是要注意:其他的实例没有这个方法。