Python Class笔记1:动态添加类方法

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,会把类作为第一个参数传递进来。

动态添加类方法

  1. 直接赋值 (整了那么久,直接赋值还是yyds!)
"""外部添加方法"""
def say_hello(self):
    print('hello !')
    print(self.name)
    
# 把新定义的函数赋给类
Person.say_hello = say_hello
sls.say_hello()

运行结果:
hello !
Sao Laoshi

  1. 通过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属性
结果显示: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

直接绑定到实例上就没有问题,但是要注意:其他的实例没有这个方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值