Skip to main content
 首页 » 编程设计

python之如何要求在 Python 中实现方法

2025年05月04日18webabcd

我在 Python 中使用 duck typing。

def flagItem(object_to_flag, account_flagging, flag_type, is_flagged): 
    if flag_type == Flags.OFFENSIVE: 
        object_to_flag.is_offensive=is_flagged 
    elif flag_type == Flags.SPAM: 
        object_to_flag.is_spam=is_flagged 
    object_to_flag.is_active=(not is_flagged) 
    object_to_flag.cleanup() 
    return object_to_flag.put() 

其中不同的对象作为object_to_flag传入,所有对象都具有is_active、is_spam、is_offensive属性.它们也碰巧有一个 cleanup() 方法。

我传递的对象都具有相同的基类(它们是 Google App Engine 中的 db 对象):

class User(db.Model): 
    ... 
    is_active = db.BooleanProperty(default = True) 
    is_spam = db.BooleanProperty(default=False) 
    is_offensive = db.BooleanProperty(default=False) 
    def cleanup(): 
        pass 
 
class Post(db.Model): 
    ... 
    is_active = db.BooleanProperty(default = True) 
    is_spam = db.BooleanProperty(default=False) 
    is_offensive = db.BooleanProperty(default=False) 
    def cleanup(): 
        pass 

如何使 cleanup() 方法抽象,以便我可以为所有这些需要子级提供实现的对象拥有相同的父类?

也许更重要的是,这是“pythonic”吗?我应该走这条路,还是应该只依靠鸭子类型(duck typing)?我的背景是 Java,我正在尝试学习 Python 的做事方式。

谢谢!

请您参考如下方法:

使用abc module .具体来说,将基类的元类设置为 ABCMeta 并在 cleanup 方法上使用 @abstractmethod 装饰器。

关于这是否是“pythonic”的争论是 split 的。 PEP 3119 ,它描述了标准,列出了一些优缺点(但显然有利于 ABC)。它进入了标准库,这很好地表明许多人认为它在某些情况下很有用。对于你的情况,我认为这是合适的。