在 Python 中可以动态地为自定义类和对象增加数据成员和成员方法,这也是 Python 动态类型的一种重要体现。
import types
class Car(object):
price = 100000 # 属于类的数据成员
def __init__(self, c): # 属于对象地数据成员
self.color = c
car = Car('red') # 实例化对象
print(car.color, car.price) # 访问对象和类的数据成员
Car.price = 110000 # 修改类属性
Car.name = 'sky' # 动态增加类属性
car.color = 'blue' # 修改实例属性
print(car.color, Car.price, Car.name)
def set_speed(self, s):
self.speed = s
car.set_speed = types.MethodType(set_speed, car) # 动态为对象增加成员方法
car.set_speed(50) # 调用对象的成员方法
print(car.speed)
Python 类型的动态性使得我们可以动态为自定义类及其对象增加新的属性和行为,俗称混入(mixin)机制,这在大型项目开开发中会非常方便和实用。例如,系统中的所有用户分类非常复杂,不同用户组具有不同的行为和权限,并且可能会经常改变。这时可以独立地定义一些行为,然后根据需要来为不同的用户设置相应的行为能力。例如,可以设计一些动作,然后根据需要把这些动作附加到相应的角色上。
import types
class Person(object):
def __init__(self, n):
self.name = n
def play(self):
print(self.name + ' is playing. ')
def walk(self):
print(self.name + ' is walking. ')
def eat(self):
print(self.name + ' is eating. ')
danny = Person('Danny')
danny.play = types.MethodType(play, danny) # 动态增加一个新行为
danny.play()
danny.walk = types.MethodType(walk, danny)
danny.walk()
del danny.walk # 删除用户行为
# AttributeError: 'Person' object has no attribute 'walk'
# danny.walk()