# python 是动态编程语言,可以在运行的过程中修改代码,不需要编译就可以直接运行 # 综合:动态绑定类属性和类方法,对象属性和对象方法 class Test01(object): def __init__(self, name): self.name = name def eat(self): print("%s 正在吃放" % self.name) def run(self): print("%s 想要奔跑" % self.name) def play(self): print("%s 正在玩耍" % self.name) t1 = Test01("张三") print(t1.name) # 动态添加实例属性 t1.age = 15 print(t1.age) print("*" * 60) # 动态添加实例方法,如果直接使用 # t1.run = run # t1.run() # 是不对的,为什么呢?run()方法需要传self参数,直接这么写,run()并没有传参数,不是对象t1的实例方法 # 正解: import types t1.run = types.MethodType(run, t1) t1.run() print("*" * 60) # 动态添加类属性(这样所有的对象实例都可以使用这个属性了) t2 = Test01("李四") t3 = Test01("王五") Test01.add = "北京" print(t2.add) print(t3.add) print("*" * 60) # 动态添加类方法(静态方法也是一样) Test01.play = play t2.play() t3.play() print("*" * 60) # 补充:动态删除类属性 # del 对象.属性名 # delattr(对象, "属性名") # 补充:如何限定实例对象只能动态的添加某些指定的属性呢? # 为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性 # 注意:使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的 class Person(object): # 必须把name也添加到__slots__,不然会找不到该属性 __slots__ = ("name", "age", "add") p = Person() p.age = 15 p.add = "长沙" print(p.age, "====", p.add) # 以上都没有报错,因为name、age、add都是在范围里的 p.score = 100 print(p.score) # 没有score