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)