第十章第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)

 总结:一般在规划类的时候,属性与方法均设计好了

猜你喜欢

转载自www.cnblogs.com/ling07/p/11255721.html