封装、 私有方法、装饰器-知识点

一、封装引入
封装的体现: 将属性或者方法 私有化 就是在变量或者方法名称前面添加__
注意: 私有属性或者方法可以在自己的类内部使用。
正常修改 : 一般提供一对 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)

猜你喜欢

转载自blog.csdn.net/qq_44240254/article/details/86484281