Python动态语言之魅力揭秘

动态语言是一门在运行时可以改变其结构的语言,这句话如何理解?

我们先看看示例1。

#示例1

class Person(object):

def __init__(self,name=None,age=None):

self.name = name

self.age = age

Jack = Person("Jack",18)

print(Jack.age)

在示例1中,我们定义了Person类,然后创建了Jack对象,打印对象的age属性,这没毛病。现实中人除了名字和年龄,还会有其他属性,例如身高和体重。外汇MT4教程尝试打印一下身高属性。

print(Jack.height)

毫无疑问,这会报错,因为Person类中没有定义height属性。但是如果在程序运行的时候添加height属性,会发生什么呢?,请看示例2和示例3。

#示例2

Jack.height = 170

print(Jack.height)

#输出结果:170

#示例3

setattr(Jack,'height',170)

print(Jack.height)

#输出结果:170

在示例2中,我们给Jack添加了height属性,然后打印,没有报错,可以输出结果。我们打印一下对象的属性。

print(Jack.__dict__)

#输出结果:

# {'name': 'Jack', 'age': 18, 'height': 170}

你看,本来对象是没有height属性,但是可以在程序运行过程中给实例动态绑定属性,这就是动态语言的魅力,不过还是有一些坑的,我们再看看示例4。

#示例4

Mia = Person('Mia',18)

print(Mia.__dict__)

#输出结果:

# {'name': 'mia', 'age': 18}

奇怪!Mia对象居然没有height属性。为什么?事实上,在示例2中,我们只是给类示例动态地绑定了一个属性,而不是给类绑定属性,所以重新创建的对象是没有height属性的。如果想要给类添加,也是可以的,见示例5。

#示例5

Person.height = None

Mia = Person("Mia",18)

print(Mia.height)

#输出结果:None

搞定了属性的动态绑定,其实动态删除也是同一个道理,请看示例5。

#示例5

Mia = Person("Mia",18)

delattr(Mia,'height')

print(Mia.__dict__)

#输出结果:{'name': 'mia', 'age': 18}

搞定了属性的动态绑定和删除,接下来看看方法的绑定和删除,请看示例6。

#示例6

class Person(object):

def __init__(self,name=None,age=None):

self.name = name

self.age = age

def speak_name(self):

print(self.name)

Jack = Person("Jack",18)

Jack.speak_name = speak_name

Jack.speak_name(Jack)

print(Jack.__dict__)

Mia = Person("Mia",18)

print(Mia.__dict__)

输出结果:

Jack

{'name': 'Jack', 'age': 18, 'speak': }

{'name': 'Mia', 'age': 18}

在示例6中,对象Jack的属性中已经成功添加了speak函数。但是!有没有感觉示例6中,这个语句

Jack.speak_name(Jack)

很别扭。按常理来说,应该

Jack.speak_name()

就行了。如果想要达到这种效果,应该要像下面这样子做。

import types

Jack.speak_name = types.MethodType(speak_name,Jack)

Jack.speak_name()

#输出结果:Jack

其中MethodType用于绑定方法对象。

当然示例6都是给类示例绑定了方法,但是如果要给类绑定方法的话,又应该怎么做?请看示例7。

#示例7

import types

class Person(object):

def __init__(self,name=None,age=None):

self.name = name

self.age = age

def speak_ok(cls):

print(OK)

Person.speak_name = types.MethodType(speak_ok,Person)

Person.speak_ok()

# 输出结果:OK

猜你喜欢

转载自www.cnblogs.com/benming/p/12807940.html