对于 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 所说的属性名称不匹配和没有发现属性访问的问题属于自检, 并不会影响使用。
但是这样毫无意义~
风和日丽,雨后彩虹~