第十章第2讲:面向对象的高级编程:动态语言
1.体验python动态语言的魅力
# 定义一个空类,实例化后,给实例绑定属性与方法 class Person(object): pass s = Person() # 给实例s绑定属性 s.name = "Ann" print(s.name) def set_age(self,age): self.age = age from types import MethodType s.set_age = MethodType(set_age,s) s.set_age = 25 print(s.set_age) # 给一个实例绑定的方法,对另外的实例不起作用 s2 = Person() # s2调用s绑定的set_age方法,会报错 s2.set_age = 24 print(s2.age) 给s绑定的属性,在s2中也不可用 print(s2.name)
2.给空类绑定属性和方法
# 定义一个空类,给空类绑定方法 class Person(object): pass p1= Person() def set_age(self,age): self.age = age Person.set_age = set_age p1 = Person() p1.set_age(20) print(p1.age) p2 = Person() p2.set_age(30) print(p2.age)
给类绑定方法
# 定义一个空类,给空类绑定方法 class Person(object): pass p1= Person() def set_age(self,age): self.age = age m1 = Person() m2 = Person() from types import MethodType Person.set_age = MethodType(set_age,Person) m1.set_age(14) m2.set_age(24) # 通过MethodType给类绑定方法后,set_age就是设置类的属性 print(m1.age) print(m2.age) # 下面的代码分别给m1,m2实例增加属性,并赋值20,30 m1.age = 20 m2.age = 30 print(m1.age,m2.age) 结果: 24 24 20 30
3.__slots__限制
# 使用__slots__现在实例随意添加属性 class Person(object): __slots__ = ("name","age") m1 = Person() m1.name = "Ann" m1.age = 30 print(m1.name,m1.age) # 由于weight没有被放在__slots__中,所以不能绑定weight属性 m1.weight = 40
使用__slots__注意:仅仅对当前类实例起作用,对继承该类的子类不起作用
# 使用__slots__现在实例随意添加属性 class Person(object): __slots__ = ("name","age") m1 = Person() m1.name = "Ann" m1.age = 30 print(m1.name,m1.age) # 使用__slots__注意:仅仅对当前类实例起作用,对继承该类的子类不起作用 class Student(Person): pass s = Student() s.name = "Bela" s.age = 24 s.weight = 50 print(s.name,s.age) print(s.weight)
总结:一般在规划类的时候,属性与方法均设计好了