P4
动态给实例添加属性和方法,体现了动态语言的灵活性
from types import MethodType
class Person(object):
#在定义类时定义一个特殊的属性(__slots__),可以限制动态添加的属性
   __slots__ = ('name', 'age', 'speak')
per = Person()
# 动态添加属性,灵活
per.name = 'tom'
print(per.name)
#动态添加方法
def say(self):
    print('my name is' + self.name)
per.speak = MethodType(say, per)
# 偏函数:把一个参数固定,形成一个新的函数
#如果想要限制实例的属性怎么办
 
P5
@property
class Person(object):
    def __init__(self,age):
        # 属性直接对外暴露,不安全
        # 使用限制访问,需要自己写set和get方法才能访问 
        self.__age = age
    # 方法名为受限的变量去掉双下线
    @property  #可以使受限制的访问属性使用点语法
    def age(self):
        return self.__age = age
    @age.setter  # 去掉下划线.setter
    def age(self,age):
        if age < 0:
            age = 0
        self.__age = age
per = Person(18)
 
p5
运算符重载
print(1 + 2)
print('1' + '2')
# 不同的类型用加法会有不同的解释
class Person(object)
    def __init__(self, num):
        self.num = num
    # 运算符重载
    def __add__(self, other):
        return Person(self.num + other.unm)
    def __self__(self):
        return 'num=' + str(self.num)
per1 =Person(1)
per2 =Person(2)
print(per1 + per2)








