文章目录
装饰器的高级应用
上一篇博客里讲到了python装饰器语法的基本功能,这里我们谈一谈装饰器比较fancy的用法。
类上的装饰器
装饰器用来类定义上,有两种用法。第一种就是直接用在类成员函数的前一行,用来修饰该成员函数。另外还有一类python内置的装饰器,例如@classmethod, @staticmethod, @property。
@classmethod和@staticmethod用来定义该方法属于类的命名空间内部,不能被类的实例直接访问。
@property装饰器则可以使得成员函数当作属性一样被调用。和@property装饰器非常相关的还有两个概念,getter和setter等。
首先来看下面的代码:
import matplotlib.pyplot as plt
import numpy as np
class Circle(object):
def __init__(self, radius):
self._radius = radius
def cylinder_volume(self,height):
"""Calculate volume of cylinder with circle as base"""
return self.area * height
@property
def diameter(self):
return self._radius * 2
@diameter.setter
def diameter(self, new_diameter):
if new_diameter > 0:
self._radius = new_diameter / 2
else:
raise ValueError("Diameter should be positive!")
@property
def radius(self):
return self._radius
@radius.setter
def radius(self,value):
if value > 0 :
self._radius = value
else:
raise ValueError("Radius should be positive!")
@classmethod
def unit_circle(cls):
"""Factory method creating a circle with radius 1"""
returl cls(1)
@staticmethod
def draw(radius):
x = radius*np.sin(np.linspace(0,2*np.pi,100))
y = radius*np.cos(np.linspace(0,2*np.pi,100))
plt.plot(x,y,'r')
plt.axis('equal')
my_circle = Circle