属性和方法的动态绑定

定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。先定义class:

给实例绑定一个属性:

属性和方法的动态绑定和限制_类方法

 

给实例绑定一个方法:

属性和方法的动态绑定和限制_python_02

只是绑定这个单独的对象上,同类的其他实例化的对象的并没有受到影响。

属性和方法的动态绑定和限制_实例化_03

给类绑定一个方法:

class Person:
    pass
def set_class1(cls, class1):
    print("给类绑定了一个类方法")
    cls.class1 = class1


def set_gender(self, gender):
    print("给类绑定了一个一般方法")
    self.gender = gender

Person.set_class=MethodType(set_class1,Person)
Person.set_gender=MethodType(set_gender,Person)
Person.set_class("大一")
Person.set_gender("")
p=Person()
p.set_gender("11")

属性和方法的动态绑定和限制_动态语言_04

看来给类绑定一个一般方法也可以。。哈哈 其对象实例对象也能共享

 

属性和方法的限制

如果我们想要限制class的属性怎么办?比如,只允许对Student实例添加name和age属性。

为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class能添加的属性:

 

class Dog(object):
    __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
  
d = Dog() # 创建新的实例
d.name = 'Michael' # 绑定属性'name'
d.age = 25 # 绑定属性'age'
d.score = 99 # 绑定属性'score

 属性和方法的动态绑定和限制_动态语言_05

                               vs:

属性和方法的动态绑定和限制_类方法_06

 

大多数人都以为是才智成就了科学家,他们错了,是品格。---爱因斯坦