一、封装引入
封装的体现: 将属性或者方法 私有化 就是在变量或者方法名称前面添加__
注意: 私有属性或者方法可以在自己的类内部使用。
正常修改 : 一般提供一对 getter setter方法
class Person:
def __init__(self, name, age):
self.name = name
self.__age = age # self.__age就是一个私有属性,对象就不能使用了
# 给私有属性设置值
def set_age(self, age):
if age < 0 or age > 150:
print('不合法啊,sb')
return
self.__age = age
# 获取私有属性的值
def get_age(self):
return self.__age
def __str__(self):
msg = '姓名:{},年龄{}'.format(self.name, self.__age)
return msg
正常情况
person = Person('zs', 20)
person.age = -20
print(person)
age属性变成私有
person = Person('zs', 20)
person.__age = -20 # 不能修改
print(person)
正常修改
person = Person('zs', 20)
person.set_age(21)
print(person)
二、私有方法
在方法前添加__例如__send_message()
私有方法的作用:在开发的过程中保护核心代码。在类的外部不能使用(对象不能调用私有方法)
class A:
def test(self):
print('test')
def __test1(self):
print('test1')
def test2(self):
print('test2')
self.__test1()#可以在类的内部调用
a=A()
a.test()
# a.__test1()在外部使用报错
# a.test2()
应用场景:
class Phone:
def __phone(self):
print('正在打电话。。。')
def phone(self,money):
if money>0:
self.__phone()
else:
print('10086提醒欠费了。。。')
tel=Phone()
tel.phone(20)
tel.phone(-1)
三、封装后的限制
class Person:
def __init__(self, name, age):
self.name = name
self.__age = age
def set_age(self, age):
if age < 0 or age > 150:
print('不合法,输入有误')
return
self.__age = age
def get_age(self):
return self.__age
def __str__(self):
msg = '姓名:{},年龄{}'.format(self.name, self.__age)
return msg
person = Person('zs', 20)
print(person.__dict__)# {'name': 'zs', '_Person__age': 20}
person.__age = 10 # 因为这种方式 保存到字典的时候不会自动变成 _类名___变量名
# 因此不能覆盖类中私有属性的值,但是会添加到对象的内存中。
print(person.__dict__)#{'name': 'zs', '_Person__age': 20, '__age': 10}
四、装饰器
1、装饰器函数的本质:一个闭包函数
2、装饰器函数的作用:在不修改原函数及其调用方式的情况下,对原函数功能进行扩展。
3、语法糖—>格式:@装饰器名称
4、创建带返回值的装饰器
5、创建传递参数的装饰器
我们来测试下方函数执行完毕用的时间
def func()
for i in range(100000000):
pass
func()
首先调用time模块
import time
1)正常函数求法:
def func():
start = time.time()
for i in range(100000000):
pass
end = time.time()
print(end - start)
func()
2)闭包函数求法:
def func():
for i in range(100000000):
pass
def outter(fun):
def inner():
start = time.time()
fun()
end = time.time()
print(end - start)
return inner
inner = outter(func)
inner()
3)使用语法糖
def outter(fun):
print('xxxx')
def inner():
start = time.time()
fun()
end = time.time()
print(end - start)
return inner
@outter # inner = outter(func)
def func():
for i in range(100000000):
pass
func()
4)带返回值的装饰器
def timer(fun):
def inner():
start = time.time()
ret = fun()
end = time.time()
print(end - start)
return ret
return inner
@timer # func = timer(func)
def func():
for i in range(100000000):
pass
return 'ok'
ret = func()
print(ret)
func = timer(func)
func()
5)创建传递参数的装饰器
def timer(fun):
def inner(s):
start = time.time()
ret = fun(s) # func()
end = time.time()
print(end - start)
return ret
return inner
@timer
def func(s):
for i in range(100000000):
pass
return s
ret = func('hello') # func ---> inner()
print(ret)
6)返回任意参数
def timer(fun):
def inner(*args, **kwargs):
start = time.time()
ret = fun(*args, **kwargs) # func()
end = time.time()
print(end - start)
return ret
return inner
@timer
def func(*args, **kwargs):
for i in range(100000000):
pass
return args, kwargs
ret = func('hello', name='zs') # func ---> inner()
print(ret)