Python之面向对象进阶版1之prosperty装饰器

开始Python的复习!(以前学的忘了好多-_-)
主要参考的是Github上的一个项目:https://github.com/jackfrued/Python-100-Days
文章主要是对该项目中的内容进行学习 穿插一点自己的学习想法等内容~

@property装饰器

在之前面向对象的介绍中提到,一般不建议将属性设为私有,这样会给子类访问带来麻烦。但直接暴露又会有一系列问题,例如无法检查赋给属性的值是否有效。有一种解决办法是将属性命名以单下划线开头,通过这种方式来暗示属性是受保护的,不建议外界直接访问。(但是,这种方式防君子不防小人,如果知道命名规则一样可以被访问)

那君子的访问方式是怎么样的呢?可以通过属性的getter(访问器)和setter(修改器)方法进行对应的操作。如果要做到这一点,可以考虑使用@property装饰器来包装这两个方法,使得对属性的访问既安全又方便。

什么是装饰器?装饰器从字面上来将就是修饰事物,在python中的作用就是让一个已经存在的函数拥有一个以前没有的功能。本质上还是一个函数,功能是为其它函数添加新功能。
装饰器设计的原则:不改动被装饰函数的源代码和不改动被修饰函数的调用方式。
简单来讲就是一个可以给别的函数添加新功能的高阶函数(可以接受函数为参数或返回一个函数的函数就是高阶函数) + 嵌套函数
感觉就像PPT母版上加一个图标,这一版式对应的就都有一样。装饰器就相当于以你要修饰的函数作为参数传入,在其中又加了一个子函数用以实现要增加的功能,然后再调用原来的函数。从而保证在原来功能的基础上,做了一些修饰。这样调用很方便,不需要在每个函数源代码中都增加对应的功能。(所谓集成)

def add_log(func):
    def wrapper(*args, **kwargs):
        print('增加日志功能:')  #要加的功能函数
        func(*args, **kwargs)    # 要修饰的函数

    return wrapper


@add_log
def f1(name):
    print('普通函数 %s' % name)


@add_log
def f2(name, age):
    print('我是%s,我%s岁了' % (name, age))


f1('python')
f2('java', 10)

上边这段代码是参考链接中的例子。目前水平不够还看不出来哪里有问题....(如果有人知道的话,欢迎告知!!)

那么property这个装饰器究竟可以实现什么功能呢?(简言之就是将访问属性转化为调用方法)
修改器setter方法可以实现更改属性的功能。

class Person(object):

    def __init__(self, name, age):
        self._name = name
        self._age = age

    # 访问器 - getter方法
    @property
    def name(self):
        return self._name

    # 访问器 - getter方法
    @property
    def age(self):
        return self._age

    # 修改器 - setter方法
    @age.setter
    def age(self, age):
        self._age = age

    def play(self):
        if self._age <= 16:
            print('%s正在玩飞行棋.' % self._name)
        else:
            print('%s正在玩斗地主.' % self._name)


def main():
    person = Person('王大锤', 12)
    person.play()
    person.age = 22
    person.play()
    # person.name = '白元芳'  # AttributeError: can't set attribute


if __name__ == '__main__':
    main()

在上文这个例子中有一个age属性可以被访问,还有一个age方法可以更改这个属性,从外表调用来看就是可以访问且可以被更改。万变不离其宗,都是功能集成一步步搭建起来的。

参考链接:

https://zhuanlan.zhihu.com/p/165099833

posted @ 2021-07-13 20:31  芋圆院长  阅读(68)  评论(0编辑  收藏  举报