Python 将类方法置换成属性

1,864 阅读2分钟

MedusaSorcerer的博客


对于 Python 代码来说, 我们想快捷的对一个类方法进行操作的时候可以借助于 property 进行装饰进行。

#!/usr/bin/env python
# _*_ Coding: UTF-8 _*_


class MedusaSorcerer:
    def __init__(self):
        self.name = 'Awey'
        self.github = r'https://github.com/MedusaSorcerer'

    def format(self):
        return f'{self.name}: {self.github}'

如果你使用 MedusaSorcerer().format() 就会得到返回的一串字符串对象, 当然, 我们还可以这样做:

#!/usr/bin/env python
# _*_ Coding: UTF-8 _*_


class MedusaSorcerer:
    def __init__(self):
        self.name = 'Awey'
        self.github = r'https://github.com/MedusaSorcerer'

    @property
    def format(self):
        return f'{self.name}: {self.github}'


m = MedusaSorcerer()
print(m.format)  # 输出字符串:"Awey: https://github.com/MedusaSorcerer"

太抽象?

换个例子:

#!/usr/bin/env python
# _*_ Coding: UTF-8 _*_


class MedusaSorcerer:
    def __init__(self):
        self.number = 1

    def get_number(self):
        return self.number

    def set_number(self, value):
        if value > 100:
            self.number = value
        else:
            self.number = value + 100

    def del_number(self):
        del self.number

我将上面的代码保存为 medusa.py:

正常, 没问题, 运行没报错, 逻辑也没有问题, Nice~

接下来进行数码进化:

#!/usr/bin/env python
# _*_ Coding: UTF-8 _*_


class MedusaSorcerer:
    def __init__(self):
        self._number = 1

    @property
    def number(self):
        return self._number

    @number.setter
    def number(self, value):
        if value > 100:
            self._number = value
        else:
            self._number = value + 100

    @number.deleter
    def number(self):
        del self._number

先说明以下几点:

  • get 方法上直接用 property 进行声明
  • set 方法使用 get 方法声明的函数名称跟上 setter 属性进行声明
  • delete 方法使用 get 方法声明的函数名称跟上 deleter 属性进行声明

继续使用交互方式测试: 说明:

  • m.number 等价于进化前的 m.get_number()
  • m.number = xx 等价于进化前的 m.set_number(xx)
  • del m.number 等价于进化前的 m.del_number()
  • 使用 del 删除属性后继续创建相同名称的属性以及对应值, 不在享受装饰器的功能

简简单单, 明明白白!

又作幺蛾子?

#!/usr/bin/env python
# _*_ Coding: UTF-8 _*_


class MedusaSorcerer:
    def __init__(self):
        self._number = 1

    @property
    def get_number(self):
        return self._number

    @get_number.setter
    def set_number(self, value):
        if value > 100:
            self._number = value
        else:
            self._number = value + 100

    @get_number.deleter
    def del_number(self):
        del self._number

先放上一张 Pycharm 的提示信息:

来找个百万翻译师, 帮我翻译一下。

如果这样装饰, 也可以执行, 没有什么问题, 但是你要注意:

  • 获取属性的时候需要 m.get_number
  • 设置属性的时候需要 m.set_number = xxx
  • 删除属性的时候需要 del m.del_number

注意 Pycharm 所说的属性名称不匹配和没有发现属性访问的问题属于自检, 并不会影响使用。

但是这样毫无意义~




风和日丽,雨后彩虹~