簡體   English   中英

python 中的裝飾底座 class 方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM