如何解决在python中装饰基类方法
我有一个python类,例如:
from abc import ABC,abstractmethod
class Drawing(ABC):
@abstractmethod
def draw(self):
pass
class Sketch(Drawing):
# overriding abstract method
def draw(self):
print("Drawing a sketch")
# Driver code
R = Sketch()
R.draw()
这是他想要实现的目标:
创建一个实现draw()接口的抽象Drawing类。以Sketch类的形式开发Drawing类的子类。使用 Sketch 绘制消息使 draw() 接口更加具体。
问题: 但我也想创建改变草图样式的装饰器(例如“绘制铅笔草图”或“绘制钢笔草图”)。 我的问题是我如何才能做到正确,我在下面的代码中所做的是否正确?
class Drawing(ABC):
@abstractmethod
def draw(self):
pass
@abstractmethod
def drawPencil(self):
pass
@abstractmethod
def drawPen(self):
pass
class Sketch(Drawing):
def draw(self):
print("Drawing a sketch")
def drawPencil(self):
print("Drawing with pencil")
def drawPen(self):
print("Drawing with pen")
解决方法
我将作为基类
from abc import ABCMeta,abstractmethod
class IDrawing(metaclass=ABCMeta):
@staticmethod
@abstractmethod
def draw():
pass
class Sketch(IDrawing):
#override
def draw(self):
print("Drawing a sketch")
r = Sketch()
r.draw()
#Drawing a sketch
如果此抽象方法不需要任何 class-intern 属性,则使用 @staticmethod
。
否则使用 @classmethod
并给出第一个参数 cls
(因为 abstractmethod 不能有 self
来引用实例)。
它也可以在没有 @staticmethod
的情况下工作...
现在使用您的 print
函数,我会像这样定义装饰器:
from abc import ABCMeta,abstractmethod
class IDrawing(metaclass=ABCMeta):
@staticmethod
@abstractmethod
def draw():
pass
def pen(func):
def new_func(*args,**kwargs):
func(*args,**kwargs)
print("with a pen")
return new_func
def pencil(func):
def new_func(*args,**kwargs)
print("with a pencil")
return new_func
class Sketch(IDrawing):
#override
def draw(self):
print("Drawing a sketch")
@pen
def drawPen(self):
print("Drawing ",end="")
@pencil
def drawPencil(self):
print("Drawing ",end="")
r = Sketch()
r.draw()
r.drawPen()
r.drawPencil()
#Drawing a sketch
#Drawing with a pen
#Drawing with a pencil
我个人更喜欢返回字符串并在调用它们时使用 print
命令的函数。
from abc import ABCMeta,**kwargs):
return func(*args,**kwargs) + " with a pen"
return new_func
def pencil(func):
def new_func(*args,**kwargs) + " with a pencil"
return new_func
class Sketch(IDrawing):
#override
def draw(self):
return "Drawing a sketch"
@pen
def drawPen(self):
return "Drawing"
@pencil
def drawPencil(self):
return "Drawing"
r = Sketch()
print(r.draw())
print(r.drawPen())
print(r.drawPencil())
#Drawing a sketch
#Drawing with a pen
#Drawing with a pencil
,
你的意思是你想要不同的派生类,它们的绘图方式不同吗?
from abc import ABC,abstractmethod
class Drawing(ABC):
@abstractmethod
def draw(self):
pass
class Sketch(Drawing):
def draw(self):
print("Drawing a sketch")
class PencilSketch(Drawing):
def draw(self):
print("Drawing with pencil")
class PenSketch(Drawing):
def draw(self):
print("Drawing with pen")
drawObjs = [Sketch(),PencilSketch(),PenSketch()]
for obj in drawObjs:
obj.draw()
输出:
Drawing a sketch
Drawing with pencil
Drawing with pen
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。