[英]decorating base class methods in python
我有一個 python class,例如:
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()接口的抽象繪圖class。 以 Sketch class 的形式開發出圖紙 class 的子 class。 使用 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")
我會以 class 為基礎
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
如果此 abstractmethod 不需要任何 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):
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, abstractmethod
class IDrawing(metaclass=ABCMeta):
@staticmethod
@abstractmethod
def draw():
pass
def pen(func):
def new_func(*args, **kwargs):
return func(*args, **kwargs) + " with a pen"
return new_func
def pencil(func):
def new_func(*args, **kwargs):
return 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()
Output:
Drawing a sketch
Drawing with pencil
Drawing with pen
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.