这次我们说一下Python是一种动态语言。
所谓动态语言就是可以在运行时改变其结构语言,例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是在其他结构上的变化。
ok,基本的概念我们知道了,下面就用代码来演示一下加强对动态语言的理解。
运行过程中给对象添加一个属性
class Person(object):
def __init__(self, name, sex):
self.name = name
self.sex = sex
p = Person("小明", "男")
这里我们定义了一个Person类,Person类里面有两个属性,name和male。但是我们我知道一个人的基本信息最起码应该有年龄,但是却没有在类中定义到,好了,现在动态语言就发挥它的威力了。
我们可以在运行的过程中给对象添加一个age属性
运行过程中给对类添加一个属性
class Person(object):
def __init__(self, name, sex):
self.name = name
self.sex = sex
Person.age = 20
p = Person("小明", "男")
print(p.age)
运行过程中给类添加方法(实例方法)
这个与之前添加属性就有点不同了,需要使用types模块中的MethodType。
print(help(types.MethodType))
我们可以使用帮助来查看MethodType的用法
第一个参数传入函数名,第二个参数传入一个对象或实体,也就是传入的函数名绑定到了后面的对象上。
import types
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def eat(self):
print("吃饭")
def sleep(self):
print("我叫%s,我要睡觉" % self.name)
p = Person("小明", 20)
p.sleep = types.MethodType(sleep, p)
p.sleep()
需要注意的是:绑定完对象后,需要使用p.sleep来进行接收之后才可以调用sleep方法
我们再来说说types.MethodType(sleep, p)这句话的意思
其实相当于给sleep函数传入参数p,然后再找个一个变量进行接收,变量名可以是任何的,但是我们为了让sleep与p进行绑定所以使用p接收。
p对象后面的.sleep 相当于在p对象中有一个变量叫做sleep,这时sleep也就指向了sleep函数。当我们使用p.sleep的时候就相当于调用了sleep函数
运行过程中给类绑定静态方法
class Person(object):
def eat(self):
print("吃饭")
@staticmethod
def sleep():
print("睡觉")
Person.sleep = sleep
Person.sleep()
Person.eat("None")
格式:类名.绑定的函数名 = 绑定的函数名
运行过程中给类绑定类方法
class Person(object):
def eat(self):
print("吃饭")
@classmethod
def drink(cls):
print("喝水")
Person.drink = drink
Person.drink()
Person.eat("None")
给类绑定静态方法和绑定类方法是相同的。